(R)表,其中每列表示特定向量中是否存在值

w51jfk4q  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(112)

标题可能有点混乱,但请允许我解释一下。
假设我们将向量标记为:

v1<-c("a","x","y","z")
v2 <-c("b","g","m","r","s","x","z")
v3 <-c("a","m","x","y","z","b","r","g")
v4 <-c("d","h","a","g","s","x")

我想在R中创建一个数据表,它表示向量集合中的每个可能值是否都存在于相应的向量中,我希望这样做时不必多次迭代向量列表。
预期输出:

ID v1 v2 v3 v4
a  1  0  1  1
x  1  1  1  1
y  1  0  1  0
z  1  1  1  0
b  0  1  1  0
g  0  1  1  1
m  0  1  1  0
r  0  1  1  0
s  0  1  0  1
d  0  0  0  1
h  0  0  0  1

很抱歉,如果解释有点奇怪,我真的不知道该如何用语言来解释它。但希望示例代码和所需的输出足够清楚地解释它。
谢谢大家!

  • 我已经尝试过 *

我对如何通过向量列表的两次迭代来实现这一点有了一个基本的想法,这可以通过首先遍历向量列表一次以获得唯一ID的总列表来完成,然后第二次迭代将遍历每个向量的每个值,并根据该行的ID是否存在于向量中,手动将1或0单独添加到数据表中。
但是,如果需要解析的向量数量很大、向量更多样或者向量更大,这个过程就会耗费大量的时间,即使考虑两个循环的过程,因为我需要分别检查可能ID列表中的每个值。
一定有更简单的方法。

cu6pst1q

cu6pst1q1#

v1 <- c("a", "x", "y", "z")
v2 <- c("b", "g", "m", "r", "s", "x", "z")
v3 <- c("a", "m", "x", "y", "z", "b", "r", "g")
v4 <- c("d", "h", "a", "g", "s", "x")

nms <- paste0("v", 1:4)
list_to_do <- lapply(nms,
  FUN = get
)

(unqs <- unique(unlist(list_to_do)))

mymat <- sapply(list_to_do, function(x) as.integer(unqs %in% x))

row.names(mymat) <- unqs
colnames(mymat) <- nms

mymat

相关问题