替换大数据框架中的元素

时间:2015-02-11 14:34:15

标签: r

我有两个看起来像这样的数据框:
答:

 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列。

有人可以帮我吗?

2 个答案:

答案 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