【问题标题】:Loop or apply for sum of rows based on multiple conditions in R dataframe基于R数据框中的多个条件循环或申请行总和
【发布时间】:2015-05-04 16:17:06
【问题描述】:

我已经为我的问题拼凑了一个快速的解决方案,但我觉得它很迟钝。此外,它使用 for 循环,根据我收集的内容,在 R 中应不惜一切代价避免使用循环。任何和所有整理此代码的建议都值得赞赏。我对 R 还是很陌生,但我担心我把一个相对简单的问题弄得太复杂了。

我有一个数据集如下:

id  count   group
2   6   A
2   8   A
2   6   A
8   5   A
8   6   A
8   3   A
10  6   B
10  6   B
10  6   B
11  5   B
11  6   B
11  7   B
16  6   C
16  2   C
16  0   C
18  6   C
18  1   C
18  6   C

我想为每个唯一 ID 创建一个新数据框,其中包含该 ID 的前两个计数的总和(例如,对于 ID 2,6+8=14)。我还想附加正确的组标识符。

一般而言,当您连续几天测量不同受试者和治疗的值时,您可能需要这样做,并且您想要计算每个受试者在前 x 天测量的总数。

这是我想出的:

id <- c(rep(c(2,8,10,11,16,18),each=3))
count <- c(6,8,6,5,6,3,6,6,6,5,6,7,6,2,0,6,1,6)
group <- c(rep(c("A","B","C"),each=6))
df <- data.frame(id,count,group)

newid<-c()
newcount<-c()
newgroup<-c()
for (i in 1:length(unique(df$"id"))) {
  newid[i] <- unique(df$"id")[i]
  newcount[i]<-sum(df[df$"id"==unique(df$"id")[i],2][1:2])
  newgroup[i] <- as.character(df$"group"[df$"id"==newid[i]][1])
}

newdf<-data.frame(newid,newcount,newgroup)

我不确定的一些可能的改进/替代方案:

  • For 循环与应用函数
  • 我可以直接在 for 循环内创建数据帧,还是应该坚持创建可以后期分配给数据帧的向量?
  • 更一致的方法来访问/子集向量/列($、[]、[[]]、子集?)

【问题讨论】:

    标签: r loops apply subset multiple-conditions


    【解决方案1】:

    你可以使用data.table来做到这一点

    setDT(df)[, list(newcount = sum(count[1:2])), by = .(id, group)]
    #    id group newcount
    #1:  2     A       14
    #2:  8     A       11
    #3: 10     B       12
    #4: 11     B       11
    #5: 16     C        8
    #6: 18     C        7
    

    【讨论】:

      【解决方案2】:

      你可以使用dplyr:

      library(dplyr)
      df %>% group_by(id,group) %>% slice(1:2) %>% summarise(newcount=sum(count)) 
      

      管道语法便于阅读:将数据按id 和group 分组,取每组的前两行,然后将counts 相加

      【讨论】:

        【解决方案3】:

        您可以尝试在聚合中使用自定义函数

        sum1sttwo<-function (x){
          return(x[1]+x[2])
        }
        aggregate(count~id+group, data=df,sum1sttwo)
        

        输出是:

          id group count
        1  2     A    14
        2  8     A    11
        3 10     B    12
        4 11     B    11
        5 16     C     8
        6 18     C     7
        

        04/2015 编辑:当您的数据集很大时,dplyr 和 data.table 绝对是更好的选择。基础 R 最重要的缺点之一是数据帧太慢。但是,如果您只需要聚合一个非常简单/小型的数据集,那么 base R 中的聚合函数可以达到其目的。

        【讨论】:

          【解决方案4】:
              library(plyr)
          
              -Keep first 2 rows for each group and id
              df2 <-  ddply(df, c("id","group"), function (x) x$count[1:2])
          
              -Aggregate by group and id
              df3 <- ddply(df2, c("id", "group"), summarize, count=V1+V2)
          
              df3
              id group count
            1  2     A    14
            2  8     A    11
            3 10     B    12
            4 11     B    11
            5 16     C     8
            6 18     C     7
          

          【讨论】:

            猜你喜欢
            • 2021-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-26
            相关资源
            最近更新 更多