【问题标题】:Adding a column to every dataframe in a list with the name of the list element使用列表元素的名称向列表中的每个数据框添加一列
【发布时间】:2020-08-04 19:23:26
【问题描述】:

我有一个包含多个数据框的列表,每个列表元素都有一个唯一的名称。结构类似于这个dummy data

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

关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: r list dplyr


    【解决方案1】:

    无需变异,只需使用 dplyr 的 bind_rows 绑定即可

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

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

    【讨论】:

    • 这个答案解决方案很简单,完全符合我的要求 - 谢谢!也许你也可以回答这个问题....我从来不理解某些参数有 .在他们面前像.id。你知道为什么叫 .id 而不仅仅是 id 吗?
    【解决方案2】:

    我们可以从base R使用Map

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

    或者使用imap 来自purrr

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

    或者如果打算创建一个单独的data.frame

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

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 1970-01-01
      • 2022-08-11
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多