gpt4 book ai didi

r - 按组和列的加权均值

转载 作者:行者123 更新时间:2023-12-05 00:31:52 26 4
gpt4 key购买 nike

我希望对几列(实际上约为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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com