gpt4 book ai didi

r - 具有重复值的两个向量之间的“Set Difference”

转载 作者:行者123 更新时间:2023-12-03 13:51:05 25 4
gpt4 key购买 nike

我有3个向量

x <- c(1,3,5,7,3,8)
y <- c(3,5,7)
z <- c(3,3,8)

我想找到不在 x和不在 y中的 z元素。是否有一个 f函数可以给我以下输出:
> f(x,y)
1 3 8
> f(x,z)
1 5 7

换句话说,我想找到两个向量之间的“集差”,其中两个向量可能都有重复的值。由于明显的原因,在这种情况下,函数 %in%matchsetdiff不起作用。

最佳答案

应该有一些更好的方法可以做到这一点,但这是一种选择

get_diff_vectors <- function(x, y) {
count_x <- table(x)
count_y <- table(y)
same_counts <- match(names(count_y), names(count_x))
count_x[same_counts] <- count_x[same_counts] - count_y
as.numeric(rep(names(count_x), count_x))
}

get_diff_vectors(x, y)
#[1] 1 3 8
get_diff_vectors(x, z)
#[1] 1 5 7
get_diff_vectors(x, c(5, 7))
#[1] 1 3 3 8

我们使用 xytable的频率进行计数, match两者中出现的数字,然后从 y中减去 x的计数。最后,使用 rep重新创建剩余的向量。

仍然找不到更好的方法,但是这里是使用有点相似的逻辑的 dplyr方法。
library(dplyr)

get_diff_vectors_dplyr <- function(x, y) {
df1 <- data.frame(x) %>% count(x)
df2 <- data.frame(y) %>% count(y)
final <- left_join(df1, df2, by = c("x" = "y")) %>%
mutate_at(c("n.x", "n.y"), funs(replace(., is.na(.), 0))) %>%
mutate(n = n.x - n.y)

rep(final$x, final$n)
}

get_diff_vectors_dplyr(x, y)
#[1] 1 3 8
get_diff_vectors_dplyr(x, z)
#[1] 1 5 7
get_diff_vectors_dplyr(x, c(5, 7))
#[1] 1 3 3 8

OP提到的 vecsets包具有 vsetdiff函数,可以很容易地做到这一点
vecsets::vsetdiff(x, y)
#[1] 1 3 8
vecsets::vsetdiff(x, z)
#[1] 1 5 7
vecsets::vsetdiff(x, c(5, 7))
#[1] 1 3 3 8

关于r - 具有重复值的两个向量之间的“Set Difference”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52941312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com