R将列表对象的名称传递给列表对象本身

时间:2017-07-03 19:02:22

标签: r list lapply names

我使用R API向数据供应商收到一个命名的数据框列表。下面是我如何构建类似的结构。

spec1 <- data.frame(speed = 100, wt = 5, price = 10)
spec2 <- data.frame(speed = 1000, wt = 1, price = 100)
spec3 <- data.frame(speed = 1, wt = 50, price = 5)
mylist <- list(car = spec1,exotic = spec2, truck = spec3)

我的目标是将其转换为如下所示的平面数据框,以便将其导出到SQL数据库中。

car_type   speed     wt     price
--------   ------    ----   -----
car        100       5      10        
exotic     1000      1      100 
truck      1         50     5

我的问题是“car_type”的标识符存储为列表中数据框的名称,我不知道如何将其传递给重复函数来填充表格。

例如,我使用以下内容从列表中项目的名称中获取car_type

car_type <- sapply(seq_along(mylist), function(x) names(mylist)[x])

然后我使用以下内容在基础表中重复car_type(由“X”替换),然后追加。

category <- lapply(mylist, function(y) rep("X" ,dim(y)[1]))
mylist <- lapply(seq_along(mylist), function(x) 

但是,我似乎无法将car_type中找到的名称传递回我的数据集中创建一个新的类别列,该列会在展平时保持不变。

3 个答案:

答案 0 :(得分:2)

你可以使用这两种中的任何一种:

  dplyr::bind_rows(mylist, .id = "car_type")
  data.table::rbindlist(mylist, idcol = "car_type")

两个输出:

      car_type speed wt price
1:      car   100  5    10
2:   exotic  1000  1   100
3:    truck     1 50     5

答案 1 :(得分:0)

base R选项与Map一起使用'{1}}的'mylist'创建'car_type',然后names rbind list元素

do.call(rbind, unname(Map(cbind, car_type = names(mylist), mylist)))
#   car_type speed wt price
#1      car   100  5    10
#2   exotic  1000  1   100
#3    truck     1 50     5

答案 2 :(得分:0)

也许更具可读性:

library(magrittr)
mylist %>% do.call(rbind,.) %>% transform(car_type = rownames(.)) %>% set_rownames(NULL)