2016-09-27 5 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 

私は、各データフレーム列は要素名として値および列キーとして列の値を持つリスト要素となるベクトルのリストで終わるたいです。

したがって、この例では、結果は次のようになります。

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) 

しかし、私はこのソリューションのように本当にしません:実際にここに

$a 
[1] 1 

$b 
[1] 2 

$c 
[1] 3 

$d 
[1] 4 

$e 
[1] 5 

は、私はこれを達成する方法です。あなたはこれを達成するためのよりスマートなアイデアを持っていますか?おかげ

答えて

5

次の2つのステップベース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

1つのオプションはdata.tablesetDT)に変換し、「長い」形式に(reshape2から)meltになります'key'のNA要素を 'L1'の対応する値に置き換え、splitを 'key'に基づく 'value'に置き換えます。

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

このソリューションをありがとう!私はワンライナーが好きです:) –

関連する問題