2017-07-03 70 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)