匹配单独的数据框时计算行的平均值
Calculate mean of rows when matching separate dataframe
给定一个包含索引和数据列的数据框,如下所示:
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 数据框中找到 A 中的索引和 B 中的索引匹配的位置,然后计算 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
有几种方法可以做到这一点。第一步通常涉及查找元素匹配的位置:
mats = match(DF2$BIndex, DF$AIndex)
求均值,将相关值相加即可
(AData[mats] + AData[mats+1] + AData[mats+2])/3
我是 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
三分感谢!
您可以使用 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
给定一个包含索引和数据列的数据框,如下所示:
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 数据框中找到 A 中的索引和 B 中的索引匹配的位置,然后计算 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
有几种方法可以做到这一点。第一步通常涉及查找元素匹配的位置:
mats = match(DF2$BIndex, DF$AIndex)
求均值,将相关值相加即可
(AData[mats] + AData[mats+1] + AData[mats+2])/3
我是 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
三分感谢!
您可以使用 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