2016-09-27 76 views
2

我有一列混合類型,矢量和數據框的2列。data.frame行以列出命名元素

> my.list 
$a 
[1] 1 

$df1 
    key value 
1 b  2 
2 c  3 

$df2 
    key value 
1 d  4 
2 e  5 

我想結束一個載體列表,每個數據幀行將成爲一個列值,列值爲列值,列值爲元素名稱的列表元素。

所以導致這個例子是:

$a 
[1] 1 

$b 
[1] 2 

$c 
[1] 3 

$d 
[1] 4 

$e 
[1] 5 

其實這裏是我如何做到這一點:

my.list <- list(a = 1, 
       df1 = data.frame(key = c("b", "c"), value = 2:3), 
       df2 = data.frame(key = c("d", "e"), value = 4:5)) 

unlist(lapply(seq_along(my.list), function(i) { 
    if (is.data.frame(my.list[[i]])) { 
    with(my.list[[i]], as.list(setNames(value, key), all.names = TRUE)) 
    } else { 
    setNames(my.list[i], names(my.list[i])) 
    } 
}), recursive = FALSE) 

但我並不真的喜歡這個解決方案。你有更聰明的想法來實現這個嗎?由於

回答

5

你可以做的兩個步驟的基礎R

x = do.call(rbind, Filter(is.data.frame, my.list)) 

c(Filter(Negate(is.data.frame), my.list), as.list(setNames(x$value, x$key))) 

$a 
[1] 1 

$b 
[1] 2 

$c 
[1] 3 

$d 
[1] 4 

$e 
[1] 5 
+0

謝謝!我不習慣'funprog'函數,但它確實是一個很好的解決方案! –

4

一個選項(基於示例)將melt(從reshape2)以「長」格式,轉換爲data.tablesetDT) ,將「密鑰」中的NA元素替換爲「L1」中的相應值,並將split替換爲基於「密鑰」的「值」。

library(data.table) 
library(reshape2) 
with(setDT(melt(my.list))[is.na(key), key := L1], split(value, key)) 
+1

感謝您的解決方案!我喜歡單線:) –