Dataframe 如何使用多列值聚合数据帧中的多列

Dataframe 如何使用多列值聚合数据帧中的多列,dataframe,r,aggregate-functions,aggregation,tidyverse,Dataframe,R,Aggregate Functions,Aggregation,Tidyverse,另一个关于聚合的初学者问题 我想使用多列值在一个表中聚合多列。是的,我以前看过一些类似的帖子。然而,我认为这里的区别在于,我试图基于多个列进行聚合 例如,我的数据框: column1 column2 column3 V1 V2 A a 7 90 600 A a 7 90 600 A b 7 80 600 A b 6 70 5000 A

另一个关于聚合的初学者问题

我想使用多列值在一个表中聚合多列。是的,我以前看过一些类似的帖子。然而,我认为这里的区别在于,我试图基于多个列进行聚合

例如,我的数据框:

column1 column2 column3 V1  V2
A       a        7      90  600
A       a        7      90  600
A       b        7      80  600
A       b        6      70  5000
A       b        6      70  5000
....
对V1和V2中的数字进行汇总和求和:

column1 column2 column3 V1  V2
A       a        7      180 1200
A       b        7      80  600
A       b        6      140 10000
....
以下是我的最小化数据和代码:

#generate minimal sample data
column1 <- c("S104259","S2914138" ,"S999706","S1041120",
         rep("S1042529",6), rep('S1235729',4))
column2 <- c("  T6-R190116","T2-R190213" ,"T8-R190118",
         rep("T8-R190118",3), rep('T2-R190118',3),rep('T6-R200118',4),'T1-R200118')
column3 <- c(rep("3S_DMSO",7),rep("uns_DMSO",5),rep("3s_DMSO",2))
output_1 <- c(664,292,1158,574,38,0,2850,18,74,8,10,0,664,30)
output_2 <- c(364,34,0,74,8,0,850,8,7,8,310,0,64,380)
df <-data.frame(column1,column2,column3,output_1,output_2)

#aggregate data by the same value in  column 1, 2 and 3

new_df <- aggregate(cbind(df$output_1,df$output_2), by=list(Category=df$column1), FUN=sum)

write.table(new_df, file = "aggregatedDMSO.txt",sep="\t", row.names = F, col.names = T)
所以

如何将列1、2和3同时传递到列表中?我试着把它们放在一起,但没有成功。 第二个贪婪的问题:我的真实数据集将有很多列的输出,有没有其他方法比cbind硬编码所有它们的名字?是的,在某些情况下,我可以df[,某个索引中的所有列],但在其他情况下,我可能需要省略一些列 谢谢,,
ML

我们可以使用公式法:

aggregate(.~ column1 + column2 + column3,  df, sum)
或者,如果使用“S3”方法:

aggregate(df[c('output_1', 'output_2')], by = df[1:3], FUN = sum)
如果我们正在使用,那么它会变得更容易

library(dplyr)
df %>%
    group_by_at(vars(starts_with('column'))) %>%
    summarise_at(vars(starts_with('output')), sum)
我们还可以同时传递多个函数

df %>%
     group_by_at(vars(starts_with('column'))) %>%
     summarise_at(vars(starts_with('output')), list(sum = sum, mean = mean, sd = sd))

我们可以使用公式法:

aggregate(.~ column1 + column2 + column3,  df, sum)
或者,如果使用“S3”方法:

aggregate(df[c('output_1', 'output_2')], by = df[1:3], FUN = sum)
如果我们正在使用,那么它会变得更容易

library(dplyr)
df %>%
    group_by_at(vars(starts_with('column'))) %>%
    summarise_at(vars(starts_with('output')), sum)
我们还可以同时传递多个函数

df %>%
     group_by_at(vars(starts_with('column'))) %>%
     summarise_at(vars(starts_with('output')), list(sum = sum, mean = mean, sd = sd))

我总是喜欢使用基本软件包和预装R的软件包。不过,就聚合而言,我更喜欢ddply方式,因为它具有灵活性。您可以使用均值和sd或您选择的任何描述性数据进行聚合

column1<-c("S104259","S2914138","S999706","S1041120",rep("S1042529",6),rep('S1235729',4))
column2<-c("T6-R190116","T2-R190213","T8-R190118",rep("T8-R190118",3),rep('T2-R190118',3),rep('T6-R200118',4),'T1-R200118')
column3<-c(rep("3S_DMSO",7),rep("uns_DMSO",5),rep("3s_DMSO",2))
output_1<-c(664,292,1158,574,38,0,2850,18,74,8,10,0,664,30)
output_2<-c(364,34,0,74,8,0,850,8,7,8,310,0,64,380)
df<-data.frame(column1,column2,column3,output_1,output_2)

library(plyr)
factornames<-c("column1","column2","column3")
plyr::ddply(df,factornames,plyr::numcolwise(mean,na.rm=TRUE))
plyr::ddply(df,factornames,plyr::numcolwise(sum,na.rm=TRUE))
plyr::ddply(df,factornames,plyr::numcolwise(sd,na.rm=TRUE))

我总是喜欢使用基本软件包和预装R的软件包。不过,就聚合而言,我更喜欢ddply方式,因为它具有灵活性。您可以使用均值和sd或您选择的任何描述性数据进行聚合

column1<-c("S104259","S2914138","S999706","S1041120",rep("S1042529",6),rep('S1235729',4))
column2<-c("T6-R190116","T2-R190213","T8-R190118",rep("T8-R190118",3),rep('T2-R190118',3),rep('T6-R200118',4),'T1-R200118')
column3<-c(rep("3S_DMSO",7),rep("uns_DMSO",5),rep("3s_DMSO",2))
output_1<-c(664,292,1158,574,38,0,2850,18,74,8,10,0,664,30)
output_2<-c(364,34,0,74,8,0,850,8,7,8,310,0,64,380)
df<-data.frame(column1,column2,column3,output_1,output_2)

library(plyr)
factornames<-c("column1","column2","column3")
plyr::ddply(df,factornames,plyr::numcolwise(mean,na.rm=TRUE))
plyr::ddply(df,factornames,plyr::numcolwise(sum,na.rm=TRUE))
plyr::ddply(df,factornames,plyr::numcolwise(sd,na.rm=TRUE))

没有,或者在这两篇文章中它被列为复制帮助?@Camille ouch,是的,这些都是有用的。很抱歉,我的谷歌给了我关于堆栈溢出的不同帖子,只有一列变量需要连接…@Camille嗨,我认为这是相似的,但不完全相同,因为它是平均值。我更喜欢Akrun提供的答案,以及他解释的方法:将FUN=mean改为FUN=sum是一个很小的区别,你不觉得吗?没有什么,或者在两篇文章中它被列为复制帮助?@Camille ouch,是的,这些都很有帮助。很抱歉,我的谷歌给了我关于堆栈溢出的不同帖子,只有一列变量需要连接…@Camille嗨,我认为这是相似的,但不完全相同,因为它是平均值。我更喜欢Akrun提供的答案,以及他解释的方法:将FUN=mean改为FUN=sum是一个很小的区别,你不觉得吗?谢谢你:嗯,对不起,我似乎只能投1票。我测试了两个答案,它们都有效。作为一个新手,下面的一个对我有更多的教育影响,我希望如果我点击下面的一个,没有什么不愉快的感觉。我们在这里没有不愉快的感觉,这是一个很好的社区,我们来这里是为了娱乐和做我们的工作。我使用cite已经两年多了,如果你遇到这样的人,我从来没有遇到过不愉快的感觉。为了保持社区的愉快,我必须报告这件事。谢谢!事实上,我在这里学习很有趣,人们都很棒,也非常乐于助人。我只想为这里的积极氛围做出贡献,或者至少不要做错任何人:仅供参考,plyr已经退休几年了,现在支持dplyr/purrr@camille要知道这一点很重要,总的来说,我反对使用库。我认为,一个人能做的最好的事情就是写下他自己的东西来做上面的事情。这不会让他自己的页面充斥着外部库和依赖者谢谢:嗯,对不起,我似乎只能投1票。我测试了两个答案,它们都有效。作为一个新手,下面的一个对我有更多的教育影响,我希望如果我点击下面的一个,没有什么不愉快的感觉。我们在这里没有不愉快的感觉,这是一个很好的社区,我们来这里是为了娱乐和做我们的工作。我使用cite已经两年多了,如果你遇到这样的人,我从来没有遇到过不愉快的感觉。为了保持社区的愉快,我必须报告这件事。谢谢!事实上,我在这里学习很有趣,人们都很棒,也非常乐于助人。我只想为这里的积极氛围做出贡献,或者至少不要做错任何人:仅供参考,plyr已经退休几年了,现在支持dplyr/purrr@camille要知道这一点很重要,总的来说,我反对使用库。我认为,一个人能做的最好的事情就是写下他自己的东西来做上面的事情。这不会使他自己的页面因外部库和依赖项而膨胀