【发布时间】:2014-08-08 23:38:43
【问题描述】:
我有一个关于为 A 列中的每个唯一 ID 查找 C 列的两个最大值,然后计算 B 列的平均值的问题。我的数据样本在这里:
ID layer weight
1 0.6843629 0.35
1 0.6360772 0.70
1 0.6392318 0.14
2 0.3848640 0.05
2 0.3882660 0.30
2 0.3877026 0.10
2 0.3964194 0.60
2 0.4273218 0.02
2 0.3869507 0.12
3 0.4748541 0.07
3 0.5853659 0.42
3 0.5383678 0.10
3 0.6060287 0.60
4 0.4859274 0.08
4 0.4720740 0.48
4 0.5126481 0.08
4 0.5280899 0.48
5 0.7492097 0.07
5 0.7220433 0.35
5 0.8750000 0.10
5 0.8302752 0.50
6 0.4306283 0.10
6 0.4890895 0.25
6 0.3790714 0.20
6 0.5139686 0.50
6 0.3885678 0.02
6 0.4706815 0.05
对于每个 ID,我想计算层的平均值,只使用两个权重最高的行。
我可以使用 R 中的以下代码来做到这一点:
ind.max1 <- ddply(index1, "ID", function(x) x[which.max(x$weight),])
dt1 <- data.table(index1, key=c("layer"))
dt2 <- data.table(ind.max1, key=c("layer"))
index2 <- dt1[!dt2]
ind.max2 <- ddply(index2, "ID", function(x) x[which.max(x$weight),])
ind.max.all <- merge(ind.max1, ind.max2, all=TRUE)
ind.ndvi.mean <- as.data.frame(tapply(ind.max.all$layer, list(ind.max.all$ID), mean))
这使用ddply 选择每个 ID 的第一个最高权重值并放入带有层的数据帧中。然后使用data.table 从原始数据帧中删除这些最高权重值。然后我重复ddply 选择最大值,并将两个最大权重值数据帧合并为一个。最后,用tapply 计算平均值。
必须有更有效的方法来做到这一点。有没有人有任何见解?干杯。
【问题讨论】:
-
是否保证两个最大值是唯一的?