在列表中堆叠数据框的列

Stacking columns of dataframes in list

我有一个包含两个数据框的列表:

dat.list<- list(dat1=data.frame(col1=c(3,4,5),
                                col2=c(5,3,1),
                                col3=c(8,2,5),
                                col4=c(6,7,4)),
                dat2=data.frame(col1=c(2,1,3),
                                col2=c(6,9,2),
                                col3=c(4,2,1),
                                col4=c(9,5,6)))
dat.list
# $dat1
#   col1 col2 col3 col4
# 1    3    5    8    6
# 2    4    3    2    7
# 3    5    1    5    4

# $dat2
#   col1 col2 col3 col4
# 1    2    6    4    9
# 2    1    9    2    5
# 3    3    2    1    6

我正在尝试堆叠列表中两个数据框中的列,以便“col3”在“col1”下方,“col4”在“col2”下方,如下所示:

# $dat1
#  newcol1 newcol2
# 1       3       5
# 2       4       3
# 3       5       1
# 4       8       6
# 5       2       7
# 6       5       4

# $dat2
#   newcol1 newcol2
# 1       2       6
# 2       1       9
# 3       3       2
# 4       4       9
# 5       2       5
# 6       1       6

我尝试将 的答案调整为 lapply() 函数,如下所示,但我收到错误消息“'closure' 类型的对象不可子集化” .

lapply(dat.list, function(x) transform(x, 
                                       data.frame(grupo1 = unlist(c(.[,"col1"], .[,"col3"])),
                                                   grupo2 = unlist(c(.[,"col2"], .[,"col4"])))))

我也探索过使用 map()pivot_longer() 的解决方案,但还没有找到方法。我怎样才能得到想要的输出?

您可以将 lapplyrbindsetNames 一起使用,如下所示:

cols1 <- c("col1", "col2")
cols2 <- c("col3", "col4")

lapply(dat.list, function(x) rbind(x[, cols1], setnames(x[, cols2], cols1)))

Returns

#$dat1
#  col1 col2
#1    3    5
#2    4    3
#3    5    1
#4    8    6
#5    2    7
#6    5    4
#
#$dat2
#  col1 col2
#1    2    6
#2    1    9
#3    3    2
#4    4    9
#5    2    5
#6    1    6

如果没有 setNames,我们会从 rbind 中看到以下错误:

Error in match.names(clabs, names(xi)) : names do not match previous names

所以我们需要一个“Simple way to get rbind to ignore column names”。