2016-05-01 7 views
1

リストのすべての要素で同じ変数にリストの特定の要素で発生する変数の値を追加し、同じは、私が質問で立ち往生しています

のための任意のアイデアをいただければ幸いですI 3つのデータフレームのリストを持って考える:

D1 <- data.frame(ID = sample(1:10), Y = sample(c("yes", "no"), 10, replace =TRUE)) 
D2 <- data.frame(ID = sample(5:14), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
D3 <- data.frame(ID = sample(7:16), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
L <- list(D1, D2, D3) 
names <- c(D1, D2, D3) 
names(L) <- names 
DF<-as.list(names(L)) 
L <- mapply(cbind, L, "DF"=DF, SIMPLIFY=F) 

Iは、特定のID、例えばID = 16の場合、D1とD2で発生のみないように変数IDを変更したいですD3では、それをD1とD2のID列に値として追加し、対応するY列を0で埋めたいとします。

リストの

すべての3つの要素は、私はrbind.fillまたは類似した何かをしようとした

ID値の組合は3つのデータ・フレームからのもので、最終的に同じIDの列を持っている必要がありますが、それを把握することはできませんし、I一般的にリストを扱うのに少し弱いです。どんな助けでも大歓迎です。

本当にありがとう、あなたは良い週末を願っています!

+0

からfull_joinを使用している、我々は(HTTP [この]を話しています/stackoverflow.com/questions/8091303/simultaneously-merge-multiple-data-frames-in-a-list)? –

答えて

1

単一の列データフレームIDsを作成し、一覧内の各データフレームとall = Tでマージして、すべてのIDを各データフレームに追加することができます。

library(dplyr) 
IDs <- data.frame(ID = unique(c(D1$ID, D2$ID, D3$ID))) 
L <- lapply(L, function(df) merge(df, IDs, by = "ID", all = T) %>% 
          mutate(Y = ifelse(is.na(Y), 0, Y))) 
+0

あなたの答えをありがとう。このソリューションは、データフレームの元のリストを返すので、私にとってはうまく機能します。変数YのNAsを0にするための提案はありますか?私は、次のような関数を使ってNAsを代入しました:set_zero_as_value < - function(x、value = 0){ x [x == "NA"] < - 値 return(x) } 。再度、感謝します! –

+0

リストをループし、 'y'列の「NA」をゼロに置き換えることができます。 'L < - lapply(L、function(df)df $ Y [is.na(df $ Y)] < - 0)'となります。 – Psidom

0

別のオプションです。

これは、いくつかの後処理のクリーンアップが必要になりますが、:/:ここ

set.seed(42) 
D1 <- data.frame(ID = sample(1:10), Y = sample(c("yes", "no"), 10, replace =TRUE)) 
D2 <- data.frame(ID = sample(5:14), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
D3 <- data.frame(ID = sample(7:16), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
L <- list(D1, D2, D3) 
Reduce(function(a,b) merge(a, b, by="ID", all.x=TRUE, all.y=TRUE), L) 
# ID Y.x Y.y Y 
# 1 1 yes <NA> <NA> 
# 2 2 yes <NA> <NA> 
# 3 3 no <NA> <NA> 
# 4 4 yes <NA> <NA> 
# 5 5 no yes <NA> 
# 6 6 yes no <NA> 
# 7 7 no no yes 
# 8 8 no no yes 
# 9 9 no yes yes 
# 10 10 yes no yes 
# 11 11 <NA> no no 
# 12 12 <NA> yes yes 
# 13 13 <NA> yes no 
# 14 14 <NA> no no 
# 15 15 <NA> <NA> no 
# 16 16 <NA> <NA> yes 
0

は別のオプションは、うーんdplyr

library(dplyr) 
Reduce(function(...) full_join(..., by="ID"), L) 
# ID Y.x Y.y Y 
#1 10 yes no yes 
#2 9 no yes yes 
#3 3 no <NA> <NA> 
#4 6 yes no <NA> 
#5 4 yes <NA> <NA> 
#6 8 no no yes 
#7 5 no yes <NA> 
#8 1 yes <NA> <NA> 
#9 2 yes <NA> <NA> 
#10 7 no no yes 
#11 14 <NA> no no 
#12 12 <NA> yes yes 
#13 11 <NA> no no 
#14 13 <NA> yes no 
#15 16 <NA> <NA> yes 
#16 15 <NA> <NA> no 
関連する問題