根据R数据帧中的多个条件循环或应用行总和

根据R数据帧中的多个条件循环或应用行总和,r,loops,apply,subset,multiple-conditions,R,Loops,Apply,Subset,Multiple Conditions,我已经想出了一个快速解决我问题的办法,但我觉得它相当迟钝。此外,它使用for循环,从我收集的信息来看,在R中应该不惜一切代价避免使用for循环。任何和所有整理此代码的建议都是非常感谢的。我对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

我已经想出了一个快速解决我问题的办法,但我觉得它相当迟钝。此外,它使用for循环,从我收集的信息来看,在R中应该不惜一切代价避免使用for循环。任何和所有整理此代码的建议都是非常感谢的。我对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)

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

sum1sttwo<-function (x){
  return(x[1]+x[2])
}
aggregate(count~id+group, data=df,sum1sttwo)
2015年4月编辑:当您的数据集很大时,dplyr和data.table绝对是更好的选择。BaseR最重要的缺点之一是数据帧太慢。但是,如果您只需要聚合一个非常简单/小的数据集,则base R中的聚合函数可以达到它的目的

库(plyr)
    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
-为每个组和id保留前2行
df2您可以使用
dplyr

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

管道语法使阅读变得简单:按
id
group
对数据进行分组,取每组的前两行,然后对
计数进行求和
您可以使用
数据进行此操作。表

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
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