【问题标题】:More efficient way to get averages from data frame in R and save them back to same data frame从 R 中的数据帧获取平均值并将它们保存回同一数据帧的更有效方法
【发布时间】:2014-01-29 00:41:40
【问题描述】:

使用 R 的 plyr 库,我可以获得存储在 R 数据框中的相同变量的不同测量值的平均值,如下所示:

library(plyr)
dataAvg <- ddply(data, .(VOWEL_QUALITIES), summarise, PITCH = mean(PITCH))

数据框在哪里,比如这样:

VOWEL_QUALITIES <- c(rep("a",3),rep("i",3))
TOKEN <- c("Measurement 1", "Measurement 2", "Measurement 3", "Measurement 1", "Measurement 2", "Measurement 3")
PITCH <- c(10, 11, 12, 15, 16, 17)
data <- data.frame(VOWEL_QUALITIES, PITCH, TOKEN)

获得这些平均值后,我可以将“TOKEN”列添加到“dataAvg”数据框,并将rbind() 添加回“data”数据框,例如,如果我想绘制每个数据框的音高每个测量的元音除了它的平均值

dataAvg$TOKEN <- c(rep("Average",7))
data <- rbind(data,dataAvg)

是否有更有效的方法来执行此操作,我不必手动将额外的列添加到具有平均值的数据框中,然后手动 rbind() 将其返回到主数据框?

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    你可以使用data.table的:=把它内联:

    require(data.table)
    data = data.table(data)
    data[,AVG:=mean(PITCH),by="VOWEL_QUALITIES"]
    

    那么数据是:

      VOWEL_QUALITIES PITCH         TOKEN AVG
    1:               a    10 Measurement 1  11
    2:               a    11 Measurement 2  11
    3:               a    12 Measurement 3  11
    4:               i    15 Measurement 1  16
    5:               i    16 Measurement 2  16
    6:               i    17 Measurement 3  16
    

    看起来更容易绘制/操作

    【讨论】:

    • 嗯,这很好。谢谢你的建议。 +1,不过,最终我想使用 TOKEN 作为一个组来绘制它,所以将它内联并没有太大帮助。
    • 您可以使用此数据结构来使用ggplot2进行绘图。
    【解决方案2】:

    补充一下,这里是dplyr + ggplot2 解决方案

    library(dplyr)
    data2 = data %.%
      group_by(VOWEL_QUALITIES) %.%
      mutate(AVG = mean(PITCH))
    
    library(ggplot2)
    qplot(VOWEL_QUALITIES, PITCH, data = data2) + 
      geom_point(aes(y = AVG), color = 'red')
    

    【讨论】:

      【解决方案3】:

      这样的事情一步到位?

      rbind(
       data,
       ddply(data, .(VOWEL_QUALITIES), summarise, PITCH = mean(PITCH), TOKEN="Average")
      )
      

      结果:

        VOWEL_QUALITIES PITCH         TOKEN
      1               a    10 Measurement 1
      2               a    11 Measurement 2
      3               a    12 Measurement 3
      4               i    15 Measurement 1
      5               i    16 Measurement 2
      6               i    17 Measurement 3
      7               a    11       Average
      8               i    16       Average
      

      【讨论】:

      • 啊,好吧,我应该能够自己解决这个问题......哈。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      相关资源
      最近更新 更多