【问题标题】:Aggregating multiple dependent measures聚合多个相关度量
【发布时间】:2015-11-10 11:36:54
【问题描述】:

我需要在 R 中汇总多个相关度量 (DM)。我发现这里的以下讨论非常有用:

Aggregate / summarize multiple variables per group (i.e. sum, mean, etc)

基于此,下面的代码基本上可以满足我的需要。但是,随着 DM 数量的增加(我有很多 DM),它会变得很长:

aggregate(cbind(DM1, DM2, DV3, DM4, DM5 ... DMn) ~ F1 + F2 +
           F3, data = sst2, mean, na.rm=TRUE) 

因此,我想知道是否有一种更有效的方式来编写 DM,而不必单独键入每个 DM。大多数感兴趣的 DM 彼此相邻(即DM3DM4DM5 等),所以我正在考虑使用类似于cbind(DM1, DM3:DM10, DM14) 的东西,但这似乎不起作用。我还尝试生成相关列名的列表。不幸的是,这也不起作用:

pr<-colnames(sst2)
pr2<-pr[pr!="DM2" & pr!="DM11" & pr!="DM12" & pr!="DM13"]
pr3<-noquote(paste(pr2,collapse=","))
pp<-aggregate(cbind(pr3) ~ F1 + F2 +
           F3, data = sst2, mean, na.rm=TRUE) 

任何关于如何在聚合函数(或其他相关函数,如 ddply)中有效地包含大量 DM 的建议将不胜感激。

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    我相信这应该可行

    sst2 <- data.frame(F1=c("A","A","B","B","C","C"),
                       F2=c("A","A","A","B","B","B"),
                       F3=c("D","D","D","D","D","D"),
                       DM1=c(5,6,21,61,2,3),
                       DM2=c(1,5,3,6,1,6),
                       DM3=c(1,7,9,1,4,44))
    
    n = 3 # number of DM columns
    m = 2 # number of F columns
    
    DM <- paste0("DM", 1:n)
    
    attach(sst2)
    
    # use sapply(DM,get) but this produces separate columns
    tmp <- aggregate(sapply(DM, get) ~ F1 + F2, 
                     data = sst2, mean, na.rm=TRUE)
    
    detach(sst2)
    
    # combine these separate columns. The apply is to each row of tmp
    data.frame(F1 = tmp$F1, F2 = tmp$F2,
        DM = apply(tmp[(m+1):(n+length(DM)-1)], 1, mean))
    
    #   F1 F2        DM
    # 1  A  A  4.166667
    # 2  B  A 11.000000
    # 3  B  B 22.666667
    # 4  C  B 10.000000
    

    编辑

    如果您的变量名称不同于唯一需要更改的行是

    DM <- c("mean.go.RT", "mean.SRT", "mean.SSD", "SSRT")
    

    如果这些变量在您的数据框中,您可以轻松获取它们

    DM <- names(sst2)[4:6]
    

    或您想要的任何其他列(即,而不是 4-6)

    【讨论】:

    • 非常感谢您的快速回复。我刚刚尝试过这个并在调用聚合函数时收到一条错误消息:> tmp
    • 另外,在我的数据中,变量名称更加多样化(例如 mean.go.RT、mean.SRT、mean.SSD、SSRT 而不是 DM1-DM4)。对于我在这里的问题,为了清楚起见,我试图稍微简化一下,但似乎这种简化实际上在某种程度上改变了解决方案——为此道歉!尽管如此,尝试使您的想法适应我​​的脚本,我收到相同的错误消息: pr3
    • 是的,我知道 - 你需要 attach 对象,否则找不到它。
    【解决方案2】:

    使用 select、ddply 和 numcolwise 的替代解决方案:

    library(dplyr)
    library(plyr)
    
    sst21 <- data.frame(F1=c("A","A","B","B","C","C"),
                       F2=c("A","A","A","B","B","B"),
                       F3=c("D","D","D","D","D","D"),
                       DM1=c(5,6,21,61,2,3),
                       DM2=c(1,5,3,6,1,6),
                       DM3=c(1,7,9,1,4,44),
                       DM4=c(2,3,6,7,2,33),
                       DM5=c(44,55,66,77,55,88))
    
    sel1 <- dplyr::select(sst21, starts_with("F"), .data$DM1 : .data$DM3, .data$DM5) # select columns of interest
    sel1 <- dplyr::select(sst21, -c(.data$DM4)) # Alternative: specifying columns to be excluded
    
    sst22 <- plyr::ddply(sel1, .(F1, F2, F3), plyr::numcolwise(mean, na.rm = TRUE)) # Aggregate selected data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多