如何将回调函数传递给返回多行的aggregate()?

16807

我有一个化学特性数据集,可以从这里下载

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

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

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()吗?

16807

这很la脚,但是我确实找到了一种通过从回调返回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

我得到了一个向量列表,我从这个答案中学到了,可以将其展平为一个向量:

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

我将向任何能找到更简洁解决方案的人致谢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章