我从这里下载了一个化学性质的数据集。
我想过滤这个数据集。对于给定的化合物、相和压力,我只想要在测量值最低的温度以上进行的测量。
例如,对于比热容,我想要这样:
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()
之外,我还应该使用其他功能吗?
这很蹩脚,但我确实找到了一种方法来解决这个问题,即从回调中返回一个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,]
谁能想出更简洁的解决办法,我就把答案让给谁。