2017-08-16 13 views
1

から列/行名の一致を使用して置き換える:条件Iは、2つのデータフレームを有する他のデータフレーム

id <- c("a", "b", "c") 
a <- 0 
b <- 0 
c <- 0 
df1 <- data.frame(id, a, b, c) 

    id a b c 
1 a 0 0 0 
2 b 0 0 0 
3 c 0 0 0 

num <- c("a", "c", "c") 
partner <- c("b", "b", "a") 
value <- c("10", "20", "30") 
df2 <- data.frame(num, partner, value) 

    num partner value 
1 a  b 10 
2 c  b 20 
3 c  a 30 

私はすべてのインスタンスdf1$id==df2$num & colnames(df1)==df2$partnerdf2$valuedf1にゼロを交換したいです。だから、出力は次のようになります。私は次のように個々のセルを置き換えることができます

a <- c(0, 0, 30) 
b <- c(10, 0, 20) 
c <- c(0, 0, 0) 
df.nice <- data.frame(id, a, b, c) 

    id a b c 
1 a 0 10 0 
2 b 0 0 0 
3 c 30 20 0 

df1$b[df1$id=="a"] <- ifelse(df2$num=="a" & df2$partner=="b", df2$value, 0) 

が、私は大規模なデータフレームのためのすべての可能なdf1の行/列の組み合わせを循環する必要があります。私はこれがプライマリとマッチを伴うと思われますが、どのように判断するのか分かりません。

Updateへ@MikeH。

おかげで、私は形を整え使用になってきました。

df.nice <- melt(df2, id=c("num", "partner")) 
df.nice <- dcast(test.nice, num ~ partner, value.var="value") 

がこれを生成するために:これが動作しているようです

num a b 
1 a <NA> 10 
2 c 30 20 

すべてのゼロとして表現し、私は、しかし、すべての可能な行/列の組み合わせが必要です。別のデータフレーム(例:df1)から行と列を取得するように再構成を依頼する方法がありますか、再形成した後でバインドする必要がありますか?

+0

'rowname(DF1)'? – PoGibas

+0

あなたは本当に置き換えが必要ですか、実際には 'df2'を' df.nice'のフォーマットに再構成しようとしていますか? –

+0

@Mike H. reshapeは、可能なすべての行/列の組み合わせが含まれている場合に機能します。今すぐ試してみてください、 – hoho

答えて

0

あなたは、私はシンプルなベースR・ソリューションを行うことであろうと思います(というリシェイプより)置き換えたい場合:私は、行/列の組み合わせ検索を構築

idxs <- t(mapply(cbind, match(df2$num, df1$id), match(df2$partner, names(df1)))) 
df1[idxs] <- df2$value 

df1 
    id a b c 
1 a 0 10 0 
2 b 0 0 0 
3 c 30 20 0 

t(mapply(...))を使用して交換します。 df1[idxs]のように選択すると、マトリックスに変換され(特定の行/列の組み合わせを選択するため)、data.frameに変換されます。


私は、値が(代わりに数字の)適切に登録しますのでstringsAsFactors = FALSEを使用してデータを読み込む必要がありました。

データ:

df2 <- data.frame(num, partner, value, stringsAsFactors = F) 
df1 <- data.frame(id, a, b, c, stringsAsFactors = F) 
関連する問題