2

我有不同数量的列和行的大数据框。我会在数据框中搜索给定向量的值,并删除与给定向量的值匹配的单元格行。我想把它作为一个函数,因为我必须在可变行和列的多个数据帧上运行它,并且我希望避免for循环。

例如

ff<-structure(list(j.1 = 1:13, j.2 = 2:14, j.3 = 3:15), .Names = c("j.1","j.2", "j.3"), row.names = c(NA, -13L), class = "data.frame")

删除所有单元格包含值的行8,9,10

我想我可以使用ff[ !ff[,1] %in% c(8, 9, 10), ]subset(ff, !ff[,1] %in% c(8,9,10) )

但为了从数据集中删除所有值,我必须解析每一列(可能有一个for循环,我希望避免这种情况)。

还有其他(更清洁)的方式吗?

非常感谢

4

2 回答 2

7

apply您对每一行的测试:

keeps <- apply(ff, 1, function(x) !any(x %in% 8:10))

它给出了一个布尔向量。然后用它子集:

ff[keeps,]

   j.1 j.2 j.3
1    1   2   3
2    2   3   4
3    3   4   5
4    4   5   6
5    5   6   7
11  11  12  13
12  12  13  14
13  13  14  15
> 
于 2012-06-12T20:27:23.143 回答
4

我想该apply策略可能会证明是最经济的,但也可以执行以下任一操作:

 ff[ !rowSums( sapply( ff, function(x) x %in% 8:10) ) , ]
ff[ !Reduce("+", lapply( ff, function(x) x %in% 8:10) ) , ]

逻辑向量的向量加法,(等价于any)后跟否定。我怀疑第一个会更快。

于 2012-06-12T20:56:52.803 回答