'x'必须是至少二维的数组

时间:2019-03-26 11:52:35

标签: r

我有一个包含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

1 个答案:

答案 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, ]