【问题标题】:How can I pass a callback function to aggregate() that returns multiple rows?如何将回调函数传递给返回多行的聚合()?
【发布时间】:2021-05-25 04:01:23
【问题描述】:

我有一个从 here 下载的化学性质数据集。

我想过滤这个数据集。对于给定的化合物、相和压力,我只想要在发生最低测量的温度以上进行的测量。

例如,对于比热容,我想要这样的东西:

aggregate(
  seq(nrow(data)),
  list(data$phase, data$compound, data$p), 
  function(ids) {  
    subset = data[ids,]
    subset[ subset$T > subset$T[  subset$Cp == min(subset$Cp)  ] ,]   
  } 
)

但是,这会返回一些我无法理解的东西。如果我不得不猜测,我会说它返回一个数据帧,其中一列中的单元格由包含我从回调函数返回的数据帧内容的向量填充。

有什么方法可以说服aggregate() 对回调返回的数据帧调用rbind()?除了aggregate(),还有什么我应该使用的功能吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    这很蹩脚,但我确实找到了一种解决问题的方法,方法是从回调中返回一个 id 向量:

    id.list = aggregate(
      seq(nrow(data)),
      list(data$phase, data$compound, data$p), 
      function(ids) {  
        subset = data[ids,]
        ids[ subset$T > subset$T[  subset$Cp == min(subset$Cp)  ] ]   
      }
    )
    

    这会返回一个数据框,其中的一列 x 存储 id 向量。

    如果我选择该列:

    id.list$x

    我得到了一个向量列表,我从this answer 学到的可以被展平为一个向量:

    stack(id.list$x)$values

    这是一个单一的 id 向量。然后我只从原始数据框中检索行:

    data[stack(id.list$x)$values,]

    所以整个代码如下:

    id.list = aggregate(
      seq(nrow(data)),
      list(data$phase, data$compound, data$p), 
      function(ids) {  
        subset = data[ids,]
        ids[ subset$T > subset$T[  subset$Cp == min(subset$Cp)  ] ]   
      }
    )
    answer = data[stack(id.list$x)$values,]
    

    我会向任何能找到更简洁解决方案的人承认答案。

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2013-06-06
      • 2017-12-10
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多