2 つのデータ フレームがあります。
df1
x1 x2
1 a
2 b
3 c
4 d
と
df2
x1 x2
2 zz
3 qq
生成する df1$x1 と df2$x2 の間の条件付き一致に基づいて、df1$x2 の値の一部を df2$x2 の値に置き換えたいと考えています。
df1
x1 x2
1 a
2 zz
3 qq
4 d
match()
df1の値が一意であると仮定して、を使用します。
df1 <- data.frame(x1=1:4,x2=letters[1:4],stringsAsFactors=FALSE)
df2 <- data.frame(x1=2:3,x2=c("zz","qq"),stringsAsFactors=FALSE)
df1$x2[match(df2$x1,df1$x1)] <- df2$x2
> df1
x1 x2
1 1 a
2 2 zz
3 3 qq
4 4 d
値が一意でない場合は、次を使用します。
for(id in 1:nrow(df2)){
df1$x2[df1$x1 %in% df2$x1[id]] <- df2$x2[id]
}
Joris と Aaron はどちらも因数なしで例を作成することを選択したようです。その選択はもちろん理解できます。すでに要因である列を持つ読者の場合、「文字」への強制のオプションもあります。その制約を回避し、これまでに投稿された Joris Meys のソリューションを無効にするが、Aaron のソリューションを無効にdf2
しないと思われるインデックスが存在する可能性も考慮に入れる戦略があります。df1
df1 <- data.frame(x1=1:4,x2=letters[1:4])
df2 <- data.frame(x1=c(2,3,5), x2=c("zz", "qq", "xx") )
両方の因子変数の共通部分を含むようにレベルを拡張する必要があり、さらに match(df1$x1, df2$x1) で一致しない列 (= NA 値) を削除する必要があります。
df1$x2 <- factor(df1$x2 , levels=c(levels(df1$x2), levels(df2$x2)) )
df1$x2[na.omit(match(df2$x1,df1$x1))] <- df2$x2[which(df2$x1 %in% df1$x1)]
df1
#-----------
x1 x2
1 1 a
2 2 zz
3 3 qq
4 4 d
(R の最近のバージョンでは、Rのほとんどの履歴とは異なりstringsAsFactors
、関数の既定値で TRUE に設定されていないことに注意してください。)data.frame
他の方法で一致させることもできますが、より複雑です。Joris の解決策の方が優れていますが、どちらの方法で一致させたいかを考えるためのリマインダーとして、これもここに入れています。
df1 <- data.frame(x1=1:4, x2=letters[1:4], stringsAsFactors=FALSE)
df2 <- data.frame(x1=2:3, x2=c("zz", "qq"), stringsAsFactors=FALSE)
swap <- df2$x2[match(df1$x1, df2$x1)]
ok <- !is.na(swap)
df1$x2[ok] <- swap[ok]
> df1
x1 x2
1 1 a
2 2 zz
3 3 qq
4 4 d