2017-07-03 112 views
2

我使用R API向数据供应商收到一个数据框的命名列表。以下是我将如何构建一个类似的结构。R将列表对象的名称传递给列出对象自己

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中发现的名字传回在我的数据集创建一个新的类别栏,当它被夷为平地,这将持续存在。

回答

0

还是一个base R办法是用Map从“MYLIST的names创建 'car_type' '然后rbindlist元件

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

您可以使用这两个中的一个:

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 
+0

LOL。太棒了,太容易了。花了这么多小时试图弄清楚这一点。非常感谢@ friep – Luongjames

0

也许更易读:

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