繁体   English   中英

在R中,按名称对数据帧列表进行排序,然后计算每个数据帧中两列的总和

[英]In R, sort a list of dataframes by name, then calculate sum of two columns in each data frame

我在论坛上搜索了一下,但找不到与我所遇到的问题类似的问题。 基本上,我有一个具有相同列名的dataframes list 我想dataframes数字对列表中的dataframes进行排序,然后计算每个dataframesCol1Col2sum ,然后将其存储在可反映dataframes排序列表的向量中。

我以为列表[order(names(list))]可以用,但是没有用。

例如:

df1 <- data.frame(Col1=c(1,2,3,4,5),Col2=c(2,3,4,5,6), Col3=rep(a,5)) 
df3 <- data.frame(Col1=c(5,4,3,2,1),Col2=c(6,5,4,3,2), Col3=rep(a,5))
df2 <- data.frame(Col1=c(1,2,3,4,5),Col2=c(1,2,3,4,5), Col3=rep(a,5))
list <- list(df1, df3, df2)
>list
$df1
Col1 Col2 Col3
   1    2    a
   2    3    a
   3    4    a
   4    5    a
   5    6    a

$df3
Col1 Col2 Col3
   5    6    a
   4    5    a
   3    4    a
   2    3    a
   1    2    a

$df2
Col1 Col2 Col3
   1    1    a
   2    2    a
   3    3    a
   4    4    a
   5    5    a

首先,我要像这样排序

$df1
Col1 Col2 Col3
   1    2    a
   2    3    a
   3    4    a
   4    5    a
   5    6    a

$df2
Col1 Col2 Col3
   1    1    a
   2    2    a
   3    3    a
   4    4    a
   5    5    a

$df3
Col1 Col2 Col3
   5    6    a
   4    5    a
   3    4    a
   2    3    a
   1    2    a

然后,我想获取每个数据帧中Col1和Col2的总和,并将其存储在新的向量中(我们将其称为x )。 结果应如下所示

x
35, 30, 35

通过我的介绍,我可以想象到既有for-loop解决方案又有lapply解决方案。

这是使用匿名函数的单行方法:

a = 1
df1 <- data.frame(Col1=c(1,2,3,4,5),Col2=c(2,3,4,5,6), Col3=rep(a,5))
df3 <- data.frame(Col1=c(5,4,3,2,1),Col2=c(6,5,4,3,2), Col3=rep(a,5))
df2 <- data.frame(Col1=c(1,2,3,4,5),Col2=c(1,2,3,4,5), Col3=rep(a,5))
list <- list(df1 = df1, df3 =df3, df2 =df2)
r = unlist(lapply(list[order(names(list))], function(df) {sum(df[,1]) + sum(df[,2])}))

这是使用sqldf软件包的一种方法。 这是您需要的吗?

library(sqldf)

df1 <- data.frame(Col1=c(1,2,3,4,5),Col2=c(2,3,4,5,6)) 
df3 <- data.frame(Col1=c(5,4,3,2,1),Col2=c(6,5,4,3,2))
df2 <- data.frame(Col1=c(1,2,3,4,5),Col2=c(1,2,3,4,5))
list <- list(df1, df3, df2)
list

df1 <- sqldf("SELECT * FROM df1 ORDER BY Col1, Col2")
df2 <- sqldf("SELECT * FROM df2 ORDER BY Col1, Col2")
df3 <- sqldf("SELECT * FROM df3 ORDER BY Col1 DESC, Col2 DESC")
df1
df2
df3

df1 <- sqldf("SELECT SUM(Col1 +Col2) FROM df1")
df2 <- sqldf("SELECT SUM(Col1+Col2) FROM df2")
df3 <- sqldf("SELECT SUM(Col1+Col2) FROM df3")
df1
df2
df3

x <- vector()
x <- c(df1, df2, df3)
x

得到以下结果:

> x
$`SUM(Col1 +Col2)`
[1] 35

$`SUM(Col1+Col2)`
[1] 30

$`SUM(Col1+Col2)`
[1] 35

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM