我有一个包含20个变量和20000个观察值的数据框。我首先将其转换为所有布尔值,以指示每个原始值是否都高于某个阈值(此处,阈值为>=1
)。
每组10个变量组成一个组。我想过滤数据以删除任何组具有5个或更多阈值以上的值的行。我怎样才能做到这一点?
我尝试了以下操作,但是第二行生成了错误消息:
MyData_filter <- as.matrix(MyData[1:20] >= 1)
keeps <- apply(MyData_filter, 1,function(x) {! any(rowSums(x[1:10])>=5) && any(rowSums(x[11:20])>=5) })
MyData_Filtered<- MyData_filter[keeps, ]
Error in rowSums(MyData_filter[1:10]) :
'x' must be an array of at least two dimensions
答案 0 :(得分:1)
问题在于您使用rowSums
,它需要二维输入。但是您一次apply
一次将一个函数赋给一行,因此x
输入是一维向量。将rowSums
更改为sum
:
function(x) {! any(sum(x[1:10])>=5) && any(sum(x[11:20])>=5) })
此外,如果我正确理解了您的问题,则!
应该同时应用于这两个条件,但是现在它仅影响第一个条件。因此,将! any() && any()
更改为!(any() && any())
。
这是不使用apply
的替代方法:
# create example data
set.seed(1234)
MyData <- as.data.frame(matrix(runif(200, 0, 2), 10, 20))
# convert to true/false for above threshold
MyData_filter <- MyData >= 1
# perform your 10-columns-at-a-time check
keeps <- rowSums(MyData_filter[ , 1:10])<5 &
rowSums(MyData_filter[ ,11:20])<5
# filter your data according to that 10-columns-at-a-time check
MyData_Filtered <- MyData_filter[keeps, ]