在列表中堆叠数据框的列
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()
的解决方案,但还没有找到方法。我怎样才能得到想要的输出?
您可以将 lapply
和 rbind
与 setNames
一起使用,如下所示:
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”。
我有一个包含两个数据框的列表:
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()
的解决方案,但还没有找到方法。我怎样才能得到想要的输出?
您可以将 lapply
和 rbind
与 setNames
一起使用,如下所示:
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”。