【问题标题】:'x' must be an array of at least two dimension'x' 必须是至少二维的数组
【发布时间】:2019-03-26 23:45:18
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案1】:

    问题在于您使用rowSums,它需要二维输入。但是您apply 一次执行一个函数,因此x 输入是一维向量。将 rowSums 更改为 sum

    function(x) {! any(sum(x[1:10])>=5) && any(sum(x[11:20])>=5) })
    

    另外,如果我正确理解您的问题,! 应该适用于这两个标准,但现在它只影响第一个标准。所以把! any() &amp;&amp; any()改成!(any() &amp;&amp; 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, ]
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 2021-10-03
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多