我有一个化学特性数据集,可以从这里下载。
我想过滤此数据集。对于给定的化合物,相和压力,我只希望在最低测量发生的温度以上进行测量。
例如,对于特定的热容量,我想要这样的东西:
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()
吗?
这很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] 删除。
我来说两句