【发布时间】:2012-07-03 00:12:44
【问题描述】:
我有一个scores (V3) 的数据框,用于一系列整数范围(V1 到V2)。
scores <- structure(list(V1 = c(2037651L, 2037659L, 2037677L, 2037685L,
2037703L, 2037715L), V2 = c(2037700L, 2037708L, 2037726L, 2037734L,
2037752L, 2037764L), V3 = c(1.474269, 1.021012, 1.180993, 1.717131,
2.361985, 1.257013)), .Names = c("V1", "V2", "V3"), class = "data.frame",
row.names = c(NA, -6L))
V1 V2 V3
1 2037651 2037700 1.474269
2 2037659 2037708 1.021012
3 2037677 2037726 1.180993
4 2037685 2037734 1.717131
5 2037703 2037752 2.361985
6 2037715 2037764 1.257013
我还有一个整数向量。
coords <- structure(list(V1 = c(2037652, 2037653, 2037654, 2037655, 2037656,
2037657, 2037658, 2037659, 2037660, 2037661, 2037662, 2037663,
2037664, 2037665, 2037666, 2037667, 2037668, 2037669, 2037670,
2037671)), .Names = "V1", row.names = c(NA, -20L), class = "data.frame")
对于每个整数(coords),我想确定整数范围(分数V1 到V2)包含coord$V1 的所有分数(scores$V3)的平均值。为此,我尝试了:
for(i in 1:nrow(coord)){
range_scores <- subset(scores,
scores$V1 <= coord$V1[i] & scores$V2 >= coord$V1[i])
coord$V2[i] <- mean(range_scores$V3)
}
该功能有效,但速度极慢。
我怎样才能更有效地完成同样的事情?
【问题讨论】:
-
你的意思是
coords$V还是coords$V1? -
我认为您可能想使用 cut 来创建一个新列,然后使用拆分 lapply 组合,但很难准确地推测出您所追求的。
-
我没有得到与使用您的代码时相同的输出。我的解决方案是:
coord$V2 <- sapply(coord$V1, function(x) mean(scores[scores[, 2] > x & x > scores[, 1], 3]))。然后我得到你显示的输出,但它比你的慢 4 倍:-((当我使用你的 for 循环时,所有 V2 都是 1.474269) -
我刚刚发布了一个类似的代码,然后我看到了你的评论,我删除了我的代码。虽然 sapply 和 lapply 仍然是循环,但我认为它们更有效地处理数据并且应该更快!我想知道你为什么说它慢了 4 倍?
-
对不起。我最初将
coord设为向量,因此我不得不将nrow更改为length,而当我将coord设为data.frame时,我忘记将其改回来。现在看来,使用sapply会快一点
标签: r vectorization subset