将元素名称粘贴到每个列表元素的列中
Paste element name onto columns in each list element
我有一个数据帧列表。每个列表元素都有一个唯一的名称,但所有数据框中的列名称都是相同的。
我想paste
将每个数据框的名称添加到列中,这样当我cbind
将它们组合成一个大数据框时我可以区分它们。
示例数据;
LIST <- list(df1 = data.frame("ColA" = c(1:5), "ColB" = c(10:14)),
df2 = data.frame("ColA" = c(21:25), "ColB" = c(30:34)))
str(LIST)
List of 2
$ df1:'data.frame': 5 obs. of 2 variables:
..$ ColA: int [1:5] 1 2 3 4 5
..$ ColB: int [1:5] 10 11 12 13 14
$ df2:'data.frame': 5 obs. of 2 variables:
..$ ColA: int [1:5] 21 22 23 24 25
..$ ColB: int [1:5] 30 31 32 33 34
期望的输出;
List of 2
$ df1:'data.frame': 5 obs. of 2 variables:
..$ df1.ColA: int [1:5] 1 2 3 4 5
..$ df1.ColB: int [1:5] 10 11 12 13 14
$ df2:'data.frame': 5 obs. of 2 variables:
..$ df2.ColA: int [1:5] 21 22 23 24 25
..$ df2.ColB: int [1:5] 30 31 32 33 34
您可以在具有全局分配 <<-
的 lapply
中执行此操作。
lapply(seq_along(LIST), function(x)
names(LIST[[x]]) <<- paste0(names(LIST)[x], ".", names(LIST[[x]])))
或者按照@Sotos的建议使用Map
LIST <- Map(function(x, y) {names(x) <- paste0(y, '.', names(x)); x}, LIST, names(LIST))
产量
str(LIST)
# List of 2
# $ df1:'data.frame': 5 obs. of 2 variables:
# ..$ df1.ColA: int [1:5] 1 2 3 4 5
# ..$ df1.ColB: int [1:5] 10 11 12 13 14
# $ df2:'data.frame': 5 obs. of 2 variables:
# ..$ df2.ColA: int [1:5] 21 22 23 24 25
# ..$ df2.ColB: int [1:5] 30 31 32 33 34
您好,您可以使用 map2
来执行此操作:
library(tidyverse)
map2(mylist, names(mylist), ~rename_all(.x, function(z) paste(.y, z, sep = ".")))
编辑:
或者按照评论中的建议使用 imap
imap(mylist, ~rename_all(.x, function(z) paste(.y, z, sep = ".")))
既然你说以后要用cbind
,你可能马上就用as.data.frame
as.data.frame(LIST)
# df1.ColA df1.ColB df2.ColA df2.ColB
#1 1 10 21 30
#2 2 11 22 31
#3 3 12 23 32
#4 4 13 24 33
#5 5 14 25 34
感谢@RonakShah,您可以使用以下行取回列表以备不时之需
df1 <- as.data.frame(LIST)
split.default(df1, sub("\..*", "", names(df1)))
我有一个数据帧列表。每个列表元素都有一个唯一的名称,但所有数据框中的列名称都是相同的。
我想paste
将每个数据框的名称添加到列中,这样当我cbind
将它们组合成一个大数据框时我可以区分它们。
示例数据;
LIST <- list(df1 = data.frame("ColA" = c(1:5), "ColB" = c(10:14)),
df2 = data.frame("ColA" = c(21:25), "ColB" = c(30:34)))
str(LIST)
List of 2
$ df1:'data.frame': 5 obs. of 2 variables:
..$ ColA: int [1:5] 1 2 3 4 5
..$ ColB: int [1:5] 10 11 12 13 14
$ df2:'data.frame': 5 obs. of 2 variables:
..$ ColA: int [1:5] 21 22 23 24 25
..$ ColB: int [1:5] 30 31 32 33 34
期望的输出;
List of 2
$ df1:'data.frame': 5 obs. of 2 variables:
..$ df1.ColA: int [1:5] 1 2 3 4 5
..$ df1.ColB: int [1:5] 10 11 12 13 14
$ df2:'data.frame': 5 obs. of 2 variables:
..$ df2.ColA: int [1:5] 21 22 23 24 25
..$ df2.ColB: int [1:5] 30 31 32 33 34
您可以在具有全局分配 <<-
的 lapply
中执行此操作。
lapply(seq_along(LIST), function(x)
names(LIST[[x]]) <<- paste0(names(LIST)[x], ".", names(LIST[[x]])))
或者按照@Sotos的建议使用Map
LIST <- Map(function(x, y) {names(x) <- paste0(y, '.', names(x)); x}, LIST, names(LIST))
产量
str(LIST)
# List of 2
# $ df1:'data.frame': 5 obs. of 2 variables:
# ..$ df1.ColA: int [1:5] 1 2 3 4 5
# ..$ df1.ColB: int [1:5] 10 11 12 13 14
# $ df2:'data.frame': 5 obs. of 2 variables:
# ..$ df2.ColA: int [1:5] 21 22 23 24 25
# ..$ df2.ColB: int [1:5] 30 31 32 33 34
您好,您可以使用 map2
来执行此操作:
library(tidyverse)
map2(mylist, names(mylist), ~rename_all(.x, function(z) paste(.y, z, sep = ".")))
编辑:
或者按照评论中的建议使用 imap
imap(mylist, ~rename_all(.x, function(z) paste(.y, z, sep = ".")))
既然你说以后要用cbind
,你可能马上就用as.data.frame
as.data.frame(LIST)
# df1.ColA df1.ColB df2.ColA df2.ColB
#1 1 10 21 30
#2 2 11 22 31
#3 3 12 23 32
#4 4 13 24 33
#5 5 14 25 34
感谢@RonakShah,您可以使用以下行取回列表以备不时之需
df1 <- as.data.frame(LIST)
split.default(df1, sub("\..*", "", names(df1)))