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

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

我在论坛上搜索了一下,但找不到与我的问题类似的问题。基本上,我有一个 list of 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 解决方案。

这是使用 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

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

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])}))