【问题标题】:Add mean columns to dataframe by category with NA's使用 NA 按类别将平均列添加到数据框
【发布时间】:2014-09-19 10:54:55
【问题描述】:

我正在尝试使用一些代码向我的数据框添加一列均值,即使它们包含 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

任何帮助将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    试试:

     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
    

    如果您想在starts 名称为value 的多个列中查找mean

    例如:

     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
    

    【讨论】:

    • 正是我想要的,非常感谢! :-)
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多