将因子写入数据帧列表(因子是数据帧的名称)

时间:2018-04-16 17:49:24

标签: r

我有list1个数据帧,我希望稍后do.call("rbind", list1),但首先我要为每个数据帧添加一个识别因子。该因子应该是数据帧的名称:

    list1 <- lapply(vector("list", 6), function(x) 
                    data.frame(replicate(10,sample(0:1,1000,rep=TRUE))))
    names(list1) <- LETTERS[1:6]

e.g。将“A”分配给第一个数据帧“A”的每一行,依此类推:

list[[1]]$Cat <- "A"
list[[2]]$Cat <- "B" #etc

我试过像

这样的东西
list1 <- lapply(list1, function(x)
                       {list1[[x]]$Cat<- names(list1[[x]]); x})

但失败了:

Error in list1[[x]] : invalid subscript type 'list'

如何实现我想要的? 谢谢。

1 个答案:

答案 0 :(得分:2)

使用tidyverse包可以轻松完成此操作:

library( tidyverse )
imap( list1, ~mutate(.x, Cat = .y) ) %>% bind_rows

要解决这个问题:

    来自imap包的
  1. purrr将第一个参数的每个元素(在本例中为list1)与元素的名称一起传递给您在第二个参数中提供的函数。根据{{​​1}}约定,该函数可以使用imap引用元素,使用.x引用元素的名称。
  2. 第二个参数中的函数使用.y包中的mutate,这会创建一个名为dplyr的新列。
  3. 最后,Cat与您在问题中提供的bind_rows相当。
  4. 编辑:正如joran在评论中指出的那样,如果您的最终目标是将所有data.frames连接在一起,do.call( "rbind", list1 )提供了一种方便的方法来自动添加标识原始data.frame的列:

    bind_rows