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要知道这一点很重要,总的来说,我反对使用库。我认为,一个人能做的最好的事情就是写下他自己的东西来做上面的事情。这不会使他自己的页面因外部库和依赖项而膨胀