匹配单独的数据帧时计算行的平均值

时间:2015-12-18 08:27:09

标签: r dataframe mean

给定一个包含索引和数据列的数据框,如下所示:

AIndex <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
AData  <- c(3,5,6,7,3,2,1,2,3,4,5,6,7,8,9)
DF <- data.frame(AIndex,AData)

给出第二个数据框,索引中有一些重叠,如下所示:

BIndex <- c(1,4,8,11,13)
BData  <- c(3,5,7,6,5)
DF2 <- data.frame(BIndex,BData)

我的目标是能够找到A中的索引和B中的索引在A数据框中的匹配位置,然后计算A + 2行中该行的平均值。

例如,第一次A和B在A中匹配是第1行。所以我想在A(3)和接下来的两个数据点(5和6)中找到相应的数据点。所以平均值是4.6

最终结果将是一个新的数据框,如下所示:

Index Data
1     4.6
4      4
8      3
11     6
13     8

3 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。第一步将通常涉及找到元素匹配的位置:

mats = match(DF2$BIndex, DF$AIndex)

要查找方法,只需添加相关值

(AData[mats] + AData[mats+1] + AData[mats+2])/3

答案 1 :(得分:2)

我是R和这个社区的新手。我试着按照@ csgillespie的步骤。结果证明是这样的:

> DF2 <- data.frame(BIndex, BData)  
> newInd <- merge(dat, DF2, by.x="AIndex", by.y="BIndex", all.y=T)  
> newInd$newCM <- (AData[mats] + AData[mats+1] + AData[mats+2]) / 3
> newInd

  AIndex AData BData    newCM  
1      1     3     3 4.666667  
2      4     7     5 4.000000  
3      8     2     7 3.000000  
4     11     5     6 6.000000  
5     13     7     5 8.000000  

三谢!

答案 2 :(得分:2)

您可以使用data.table包执行此操作:

library(data.table)

setDT(DF2)[,mean(DF[BIndex:(BIndex+2),'AData']),BIndex]
#   BIndex       V1
#1:      1 4.666667
#2:      4 4.000000
#3:      8 3.000000
#4:     11 6.000000
#5:     13 8.000000