我有两个看起来像这样的数据框:
答:
Column1 Column2 Column3 Column4 A N P Q S W Q P WE J S L G I u E
B:
Column1 Column2 A No N WJ W B G H
我想在df中替换B [,1]中出现的所有相应元素与B [,2]中的相对元素。换句话说,元素" A" df中的(B [,1])必须用No(B [,2])替换 期望的输出:
C:
Column1 Column2 Column3 Column4 No WJ P Q S B Q P WE J S L H I u E
df A包含大约14.000行和3.000列。
有人可以帮我吗?
答案 0 :(得分:4)
您可以使用 B 作为查找表,通过data.table
执行此操作。
require(data.table)
setDT(A)
setDT(B)
setkey(B,Column1)
# Basically this loop joins A and B on A$k and B$Column1
# Then it replaces all matched vales in A$k by B$Column2
# where k iterates over all columns of A
for(k in names(A)){
setkeyv(A,k)
A[B, c(k) := i.Column2] # i.Column2 because A also has a column names Column2
}
结果:
> A
Column1 Column2 Column3 Column4
1: H I u E
2: WE J S L
3: S B Q P
4: No WJ P Q
注意: 行的顺序已更改。结果按第4列排序(又名A将Column4作为键)
答案 1 :(得分:1)
另一种选择是使用Map
base R
C <- A
C[] <- Map(function(x,y) {val <- y[,2][match(x, y[,1])]
ifelse(is.na(val), x, val)}, A, list(B))
C
# Column1 Column2 Column3 Column4
#1 No WJ P Q
#2 S B Q P
#3 WE J S L
#4 H I u E