从给定的数据框(myData
,在下面的示例中),我希望将变量的子集与值匹配至少存储在列表中的一对值(myList
,在例子如下)。
myList <- list(c(8,15), c(2,3))
v1 <- c(1, 2, 3, 8, 15)
v2 <- c(3, 7, 8, 9, 10)
v3 <- c(2, 4, 5, 6, 7)
v4 <- c(8, 15, 6, 7, 9)
myData <- cbind(v1, v2, v3, v4)
理想情况下,子集应仅由v1
和v4
组成,因为在v1中出现对8,15和对2,3,而在v4中出现对8,15。
我尝试将which
语句用于一对(即8,15),如下所示:
subset <- myData[which(myData==unlist(myList[[1]][1]) & myData==unlist(myList[[1]][2]))]
仍然,输出是一个空整数。我在which
声明中遗漏了什么吗?另外,我如何为多对值实现代码?
非常感谢你的帮助!
GION
答案 0 :(得分:2)
我找到了解决这个问题的方法:
myData[, unique(which(sapply(myList, function(y) apply(myData, 2, function(x)all(y %in% x))),arr.ind = T)[, 1])]
v1 v4
[1,] 1 8
[2,] 2 15
[3,] 3 6
[4,] 8 7
[5,] 15 9
这是一个有点丑陋的功能因此解释: apply函数检查是否可以在myData列中找到myList列表项中的所有项。 sapply函数确保搜索列表中的所有项目。哪些语句检查他可以找到哪些并给出行和列。我们只对输出列的唯一行感兴趣。有点复杂,但看看它有希望它有帮助:))