我正在尝试使用一些代码向我的数据框添加一列平均值,即使它们包含 NA(我认为这排除了许多可能性),我也可以在许多不同的列上运行。
我能做的最好的事情是:
TestData <- data.frame(geo=c(rep("AT",4),rep("DE",4)),time=c(rep(c(1990:1993),2)),value=c(NA,4,20,6,NA,NA,5,3))
mean <- aggregate(value~geo, TestData, mean)
它按类别(地理)计算正确的平均值。我怎样才能将它们右连接到数据框,以便平均值不仅仅是一个观察值,而是显示在每个时间点?我正在考虑 ddply 但无法让它正常工作。我正在寻找的数据框是:
geo time value mean (or optionally, no problem for me)
1 AT 1990 NA 10 NA
2 AT 1991 4 10 10
3 AT 1992 20 10 10
4 AT 1993 6 10 10
5 DE 1990 NA 4 NA
6 DE 1991 NA 4 NA
7 DE 1992 5 4 4
8 DE 1993 3 4 4
如有任何帮助,我们将不胜感激!
最佳答案
尝试:
testData1 <- within(TestData, {
Mean <- ave(value, geo, FUN=function(x) mean(x, na.rm=TRUE))
Mean[is.na(value)] <- NA}) #If you don't want `NA` values don't use this step
testData1
# geo time value Mean
#1 AT 1990 NA NA
#2 AT 1991 4 10
#3 AT 1992 20 10
#4 AT 1993 6 10
#5 DE 1990 NA NA
#6 DE 1991 NA NA
#7 DE 1992 5 4
#8 DE 1993 3 4
如果您想查找以名称值
开头
的多个列的平均值
:
例如:
TestData1 <- TestData
TestData1$value2 <- c(4, NA, 25, NA, NA, 10,5, 2)
library(dplyr)
res <- left_join(TestData1,
TestData1 %>%
group_by(geo) %>%
mutate_each(funs(mean=mean(., na.rm=TRUE)), starts_with("value")),
by=c("geo", "time"))
colnames(res) <- gsub("\\.y$", ".mean", colnames(res))
res
# geo time value.x value2.x value.mean value2.mean
#1 AT 1990 NA 4 10 14.500000
#2 AT 1991 4 NA 10 14.500000
#3 AT 1992 20 25 10 14.500000
#4 AT 1993 6 NA 10 14.500000
#5 DE 1990 NA NA 4 5.666667
#6 DE 1991 NA 10 4 5.666667
#7 DE 1992 5 5 4 5.666667
#8 DE 1993 3 2 4 5.666667
关于r - 使用 NA 按类别将平均列添加到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932302/