r-使用列表元素的名称向列表中的每个数据帧添加一列



我有一个包含多个数据帧的列表,每个列表元素都有一个唯一的名称。结构类似于此伪数据

a <- data.frame(z = rnorm(20), y = rnorm(20))
b <- data.frame(z = rnorm(30), y = rnorm(30))
c <- data.frame(z = rnorm(40), y = rnorm(40))
d <- data.frame(z = rnorm(50), y = rnorm(50))
my.list <- list(a,b,c,d)
names(my.list) <- c("a","b","c","d")

我想在每个数据帧中创建一个列,该列具有相应列表元素的名称。我的目标是将所有列表元素合并到一个数据帧中,并知道它们最初来自哪个数据帧。我想要的最终结果是这样的:

z           y group
1   0.6169132  0.09803228     a
2   1.1610584  0.50356131     a
3   0.6399438  0.84810547     a
4   1.0878453  1.00472105     b
5  -0.3137200 -1.20707112     b
6   1.1428834  0.87852556     b
7  -1.0651735 -0.18614224     c
8   1.1629891 -0.30184443     c
9  -0.7980089 -0.35578381     c
10  1.4651651 -0.30586852     d
11  1.1936547  1.98858128     d
12  1.6284174 -0.17042835     d

我的第一个想法是使用mutate将列表元素名称分配给每个相应数据帧中的一列,但在lapply中使用时,names((似乎指的是列名,而不是列表元素名称

test <- lapply(my.list, function(x)  mutate(x, group = names(x)))
Error: Column `group` must be length 20 (the number of rows) or one, not 2

关于如何处理这个问题,有什么建议吗?

不需要突变,只需使用dplyr的bind_rows结合即可

library(tidyverse)
my.list %>% 
bind_rows(.id = "groups")

显然需要对列表进行命名。

我们可以从base R使用Map

Map(cbind, my.list, group = names(my.list))

或使用purrr中的imap

library(dplyr)
library(purrr)
imap(my.list, ~ .x %>% mutate(group = .y))

或者如果意图创建单个数据帧

library(data.table)
rbindlist(my.list. idcol = 'groups')

最新更新