【问题标题】:How do I create a column containing aggregated means with R? [duplicate]如何使用 R 创建包含聚合均值的列? [复制]
【发布时间】:2012-08-14 03:13:27
【问题描述】:

在 R 中,我在数据框中有一堆数据,例如:

state | zip   | value
______|_______|______
CA    | 94555 | 18
CA    | 94556 | 5
OH    | 12345 | 22
OH    | 12346 | 10

等等。

我想在每一行中添加一列,列出该州的平均“值”。

我可以通过“(aggregate(data$value, list(State = data$state), mean))”获取该方法的数据框。这给了我一个有 50 行的数据框,每个州一个。但是我需要返回到原始数据框,并将状态的平均值放在属于该状态的行中。

我该怎么做呢?

【问题讨论】:

  • 澄清一下:你只想要状态的意思而不是状态+ zip的意思,对吧?
  • @mrdwab:正确,我想要该州的整体平均值。
  • 我能问一下为什么尽管(当前)有五个 >=2 答案,但这个问题没有人赞成吗?我错过了什么吗?

标签: r dataframe aggregate


【解决方案1】:

还有一个data.table 解决方案

library(data.table)
DT <-  data.table(state = c("CA","CA","OH","OH"), 
                   zip = c(94555,94556,12345,12346), 
                   value = c(18, 5, 22, 10))

DT[, mean := mean(value), by = state]

##    state   zip value mean
## 1:    CA 94555    18 11.5
## 2:    CA 94556     5 11.5
## 3:    OH 12345    22 16.0
## 4:    OH 12346    10 16.0

【讨论】:

    【解决方案2】:

    使用合并命令,例如

    df = data.frame(state=c('CA','CA','OH','OH'),zip=c(94555,94556,12345,12346),value=c(18,5,22,10))
    df2 = aggregate(df$value,list(state=df$state),mean)
    merge(df,df2)
    

    【讨论】:

    • 与接受的答案一样,这里有变量名重复:df 两次和 df2 两次。请参阅here 了解为什么变量名重复有时会导致错误。
    【解决方案3】:

    您可以使用plyr

    library(plyr)
    df<-data.frame(state=c("CA","CA","OH","OH"),zip=c(94555,94556,12345,12346),value=c(18,5,22,10))
    out<-ddply(df,.(state),transform,mean=mean(value))
    > out
      state   zip value mean
    1    CA 94555    18 11.5
    2    CA 94556     5 11.5
    3    OH 12345    22 16.0
    4    OH 12346    10 16.0
    

    正如 mnel mutate 所指出的,也可以使用并且应该更快

    ddply(df,.(state),mutate,mean=mean(value))
    

    【讨论】:

    • 你也可以用mutate代替transform
    【解决方案4】:

    现在是使用被遗忘的ave 功能的最佳时机:

    dat <- data.frame(state = c('CA','CA','OH','OH'), 
        zip = c('94555','94556','12345','12346'), 
        value = c(18,5,22,10))
    
    dat$mean <- ave(dat$value, dat$state, FUN=mean)
    

    【讨论】:

    • +1 不过,这个答案重复了dat 3 次。请参阅 here 了解变量名重复有时会如何导致错误。
    【解决方案5】:

    合并是这里的关键。

    data <- data.frame(state = c('CA','CA','OH','OH'), zip = c('94555','94556','12345','12346'), value = c(18,5,22,10))
    aggs <- aggregate(data$value, list(State = data$state), mean)
    names(aggs) <- c('state','avg')
    merge(data, aggs, by = 'state')
    

    【讨论】:

    • 这与@blindJesse 的answer 有何不同?
    • 这里的区别在于“by”。效果很好!谢谢!
    • 他的答案似乎是在我打开这个问题并提交我的答案之间。
    • 是的,这是我在重新加载页面时碰巧看到的第一个,它确实有效。我相信blindJesse 的回答也会起作用。显然,有很多方法可以给这只猫剥皮。我只是想不出正确的表达方式来让谷歌给我一个答案。
    • 这个答案重复了变量名data 3 次和agg 3 次。请参阅here 了解为什么变量名重复会导致错误。
    猜你喜欢
    • 2021-09-17
    • 2012-09-04
    • 2022-11-08
    • 2018-11-17
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多