2017-12-08 18 views
2

で別のデータフレームを使用して1つのデータフレームから複数の列の値を置き換えますこんにちは以下のように私は2つのデータフレームを持っている条件

ID x y  
2 d NA 
3 NA e 

と私はこのような結果の後に午前:

df1: 
ID x y  z  
1 a b  c  
2 a b  c 
3 a b  c 
4 a b  c 

とDF2 :

DF1:

ID x y  z  
    1 a b  c  
    2 d b  c 
    3 a e  c 
    4 a b  c 

他の投稿のようにマッチ機能を使用しようとしていますが、私のdf1データフレームがdf2のNA値で置き換えられているという問題が続きます。 これはあなたのコードは私のために動作しませんでした

for (i in names(df2)[2:length(names(df2))]) { 
    df1[i] <- df2[match(df1$ID, df2$ID)] 
} 

おかげ

+4

これは、dplyrにまだ存在しない、(https://github.com/tidyverse/tidyr/issues/183)更新が参加]でありますdf2%>%full_join(df1、by = 'ID'、接尾辞= c( ''、 '.1'))%>%mutate(x =合体) (x、x.1)、y =合体(y、y.1))%>%select(-x.1、-y.1)%>%arrange(ID) 'となります。 'df3 < - merge(df2、df1、by = 'ID'、all = TRUE、suffixes = c( ''、 '.1'));あなたが好きなら、ベースRで同じことをすることができます。 df3 $ x [is.na(df3 $ x)] < - df3 $ x.1 [is.na(df3 $ x)]; df3 $ y [is.na(df3 $ y)] < - df3 $ y.1 [is.na(df3 $ y)]; df3 [c( 'x.1'、 'y.1')] < - NULL; df3' – alistaire

答えて

0

ので、私はそれを少し変更するが、それが動作運のない私が使用しているコードです。外部ファイルからデータを読み取っている場合は、読み取ったときにstringAsFactor = FALSEを使用して問題に遭遇しないようにしてください。

df1 = data.frame("ID" = 1:4,"x" = rep("a",4), "y" =rep("b",4),"z" = rep("c",4), 
       stringsAsFactors=FALSE) 
df2 = data.frame("ID" = 2:3,"x" = c("d",NA), "y" = c(NA,"e"),stringsAsFactors=FALSE) 

for(i in 1:nrow(df2)){ 
    new_data = df2[i,-which(apply(df2[i,],2,is.na))] 
    pos = as.numeric(new_data[1]) 
    col_replace = intersect(colnames(new_data),colnames(df1)) 
    df1[pos,col_replace] = new_data 
} 
+0

ありがとうございましたAndrade、残念ながら、あなたのコードは、私のID列がそのような素敵な順番である場合にのみ機能します。実際には、私のデータは、ID = 3100,3200,3300,3400(df1では3200、3300はdf2)です。 – southwind

+0

@southwindは 'which(new_data [1] == df1 $ ID)'のようなもので 'pos'を変更するだけで、データフレーム内の位置を取得します。 –

+0

ありがとうございます。コードは、私がやろうとしていたよりもはるかに優れています:df1 [df1 $ ID == pos、col_replace] – southwind

0

dplyrを用いた溶液。この考え方は、両方のデータフレームをロングフォーマットに変換し、結合を実行して値を置き換え、フォーマットをワイドフォーマットに戻すことです。 df5が最終出力です。

library(dplyr) 
library(tidyr) 

df3 <- df1 %>% gather(Col, Value, -ID) 
df4 <- df2 %>% gather(Col, Value, -ID, na.rm = TRUE) 
df5 <- df3 %>% 
    left_join(df4, by = c("ID", "Col")) %>% 
    mutate(Value.x = ifelse(!is.na(Value.y), Value.y, Value.x)) %>% 
    select(ID, Col, Value.x) %>% 
    spread(Col, Value.x) 
df5 
# ID x y z 
# 1 1 a b c 
# 2 2 d b c 
# 3 3 a e c 
# 4 4 a b c 

DATA

df1 <- read.table(text = "ID x y  z  
1 a b  c  
        2 a b  c 
        3 a b  c 
        4 a b  c", 
        header = TRUE, stringsAsFactors = FALSE) 

df2 <- read.table(text = "ID x y  
2 d NA 
3 NA e", 
        header = TRUE, stringsAsFactors = FALSE) 
関連する問題