我希望对几列(实际上约为60列)中的每列按组获取加权均值。这个问题非常类似于:刚刚问了repeatedly applying ave for computing group means in a data frame

到目前为止,我已经提出了两种方法来获取加权均值:

  • 为每列
  • 使用单独的sapply语句
  • sapply语句放在for-loop

  • 但是,我觉得必须有一种方法可以在apply语句内插入sapply语句,反之亦然,从而消除for-loop。我尝试了许多排列,但没有成功。我还查看了sweep函数。

    这是我到目前为止的代码。
    df <- read.table(text= "
              region    state  county  weights y1980  y1990  y2000
                 1        1       1       10     100    200     50
                 1        1       2        5      50    100    200
                 1        1       3      120    1000    500    250
                 1        1       4        2      25    100    400
                 1        1       4       15     125    150    200
    
                 2        2       1        1      10     50    150
                 2        2       2       10      10     10    200
                 2        2       2       40      40    100     30
                 2        2       3       20     100    100     10
    ", header=TRUE, na.strings=NA)
    
    # add a group variable to the data set
    
    group <- paste(df$region, '_', df$state, '_', df$county, sep = "")
    df    <- data.frame(group, df)
    
    # obtain weighted averages for y1980, y1990 and y2000
    # one column at a time using one sapply per column
    
    sapply(split(df, df$group), function(x) weighted.mean(x$y1980, w = x$weights))
    sapply(split(df, df$group), function(x) weighted.mean(x$y1990, w = x$weights))
    sapply(split(df, df$group), function(x) weighted.mean(x$y2000, w = x$weights))
    
    # obtain weighted average for y1980, y1990 and y2000
    # one column at a time using a for-loop
    
    y <- matrix(NA, nrow=7, ncol=3)
    group.b <- df[!duplicated(df$group), 1]
    
    for(i in 6:8) {
    
        y[,(i-5)] <- sapply(split(df[,c(1:5,i)], df$group), function(x) weighted.mean(x[,6], w = x$weights))
    
    }
    
    # add weighted averages to the original data set
    
    y2 <- data.frame(group.b, y)
    colnames(y2) <- c('group','ave1980','ave1990','ave2000')
    y2
    
    y3 <- merge(df, y2, by=c('group'), all = TRUE)
    y3
    

    抱歉,最近我的所有问题,也谢谢您的任何建议。

    编辑以显示y3
      group region state county weights y1980 y1990 y2000   ave1980  ave1990  ave2000
    1 1_1_1      1     1      1      10   100   200    50  100.0000 200.0000  50.0000
    2 1_1_2      1     1      2       5    50   100   200   50.0000 100.0000 200.0000
    3 1_1_3      1     1      3     120  1000   500   250 1000.0000 500.0000 250.0000
    4 1_1_4      1     1      4       2    25   100   400  113.2353 144.1176 223.5294
    5 1_1_4      1     1      4      15   125   150   200  113.2353 144.1176 223.5294
    6 2_2_1      2     2      1       1    10    50   150   10.0000  50.0000 150.0000
    7 2_2_2      2     2      2      10    10    10   200   34.0000  82.0000  64.0000
    8 2_2_2      2     2      2      40    40   100    30   34.0000  82.0000  64.0000
    9 2_2_3      2     2      3      20   100   100    10  100.0000 100.0000  10.0000
    

    最佳答案

    我建议使用包data.table:

    library(data.table)
    dt <- as.data.table(df)
    dt2 <- dt[,lapply(.SD,weighted.mean,w=weights),by=list(region,state,county)]
    print(dt2)
    
       region state county   weights     y1980    y1990    y2000
    1:      1     1      1  10.00000  100.0000 200.0000  50.0000
    2:      1     1      2   5.00000   50.0000 100.0000 200.0000
    3:      1     1      3 120.00000 1000.0000 500.0000 250.0000
    4:      1     1      4  13.47059  113.2353 144.1176 223.5294
    5:      2     2      1   1.00000   10.0000  50.0000 150.0000
    6:      2     2      2  34.00000   34.0000  82.0000  64.0000
    7:      2     2      3  20.00000  100.0000 100.0000  10.0000
    

    如果您愿意,可以在之后使用原始data.table进行merge编码:
    merge(dt,dt2,by=c("region","state","county"))
    
       region state county weights.x y1980.x y1990.x y2000.x weights.y   y1980.y  y1990.y  y2000.y
    1:      1     1      1        10     100     200      50  10.00000  100.0000 200.0000  50.0000
    2:      1     1      2         5      50     100     200   5.00000   50.0000 100.0000 200.0000
    3:      1     1      3       120    1000     500     250 120.00000 1000.0000 500.0000 250.0000
    4:      1     1      4         2      25     100     400  13.47059  113.2353 144.1176 223.5294
    5:      1     1      4        15     125     150     200  13.47059  113.2353 144.1176 223.5294
    6:      2     2      1         1      10      50     150   1.00000   10.0000  50.0000 150.0000
    7:      2     2      2        10      10      10     200  34.00000   34.0000  82.0000  64.0000
    8:      2     2      2        40      40     100      30  34.00000   34.0000  82.0000  64.0000
    9:      2     2      3        20     100     100      10  20.00000  100.0000 100.0000  10.0000
    

    关于r - 按组和列的加权均值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14145859/

    10-12 01:32