2017-04-19 8 views

答えて

1

のようなデータフレームにこれを変換したいです問題:

li <- list(`20`=500,`30`=600) 
df <- data.frame(Values = do.call("rbind",li)) 
df$Id <- rownames(df) 
rownames(df) <- NULL 
df <- df[,c(2,1)] 
df 

出力:

あなたが行うことができます
> df 
    Id Values 
1 20 500 
2 30 600 
3

L <- list(`20`=500,`30`=600) 
df <- data.frame(id=names(L), values=sapply(L, function(x) x[1])) 
# > df 
# id values 
# 20 20 500 
# 30 30 600 

または少しトリッキー:

df <- data.frame(id=names(L), values=sapply(L, '[', 1)) 

今私は長いベクトル(および最初の要素だけを取る)を考えていたティル。 (コメントをアブドゥにTHX)短い溶液(リストの各要素は1つだけ要素ベクトルの場合)しかし、あなたのケースである:

df <- data.frame(id = names(L), values = unlist(L)) 
+3

うがない 'データと解決策です。フレーム(id = names(L)、values = unlist(L)) 'はより短くなりますか? – Abdou

+0

はい、素晴らしい解決策です。私は長いベクトルについて考えていました(最初の要素のみを取ります)。 – jogo

0

purrrの*_df機能は、リスト上の機能を反復処理し、簡素化データフレーム。 purrr、あなたがmap2に2番目の変数として名を渡すことができ

library(purrr) 

l <- list(`25` = 900, `26` = 500) 

l %>% imap_dfr(~data.frame(id = as.integer(.y), 
          value = .x)) 
#> id value 
#> 1 25 900 
#> 2 26 500 

またはCRANと:開発版を使用すると、第二の可変.yとして名またはインデックスを使用して新しいimapバリアントを使用することができます。 reshape2パッケージからmelt機能を使用して同じことを達成するために

l %>% map2_df(names(.), 
       ~data.frame(id = as.integer(.y), 
          value = .x)) 
#> id value 
#> 1 25 900 
#> 2 26 500 
0

簡単な方法。

library(reshape2) 
l = list('20'=500, '30'=600) 
melt(as.data.frame(l, check.names = F)) 

出力:

variable value 
1  20 500 
2  30 600 

任意のパッケージ

ls = list('20' = 500, '30' = 600, '40' = 400) 
d = data.frame('id' = row.names(as.array(unlist(ls))), 'value' = unlist(ls),row.names = 1:length(ls)) 

出力

id value 
1 20 500 
2 30 600 
3 40 700 
4 50 800 
0

非公開に関数を使用するを使用しない代替的なアプローチ。

L = list(`20`=500,`30`=600) 
df = unlist(L) 

ベクターを返します。あなたはdata.frameをしたい場合:

df = as.data.frame(t(unlist(L))) 

出力:

> df 
    20 30 
1 500 600 
0

ここMap

l <- list(`20`=500,`30`=600) 
do.call(rbind,Map(data.frame,id=names(l),values=l)) 

    id values 
20 20 500 
30 30 600 
関連する問題