根据第二个数据框替换数据帧中的列

时间:2015-07-09 00:43:51

标签: r

我有两个数据框。想要匹配df1 $ v1和df2 $ v2匹配的内容,用df1v2内容替换相应的df2 $ v2内容。

df1
v1 v2
1   a1
2   a2
3   a3

df2
v1  v2  v3 v4
c1   1  c3  c4
d1  2   d3  d4
e1  3   e3  e4   

寻找最终输出。

df2
v1 v2 v3 v4
c1 a1 c3 c4
d1 a2 d3 d4
e1 a3 e3 e4

2 个答案:

答案 0 :(得分:1)

out <- merge(df2, df1, by.x='v2', by.y='v1', all.x=T)
out <- out[, -1]

您会收到有关在两个表格中都重复列名称“v2”的投诉,因此您可以根据需要使用suppressWarnings(),或将df1的“v2”列重命名为已经在df2

merge将您的合并列作为第一列(第一个'v2'列为数字1 2 3),因此out[, -1]将其删除。

答案 1 :(得分:0)

在某些情况下,&#39;合并解决方案失败,例如如果df1 $&#34; v1&#34;和df2 $&#34; v2&#34;无处不在:

df1 <- data.frame( v1 = c(1,2,3),
                   v2 = c("a1","a2","a3") )

df2 <- data.frame( v1 = c("c1","d1","e1"),
                   v2 = c(1,5,3),
                   v3 = c("c3","d3","e3"),
                   v4 = c("c4","d4","e4") )

out <- merge(df2, df1, by.x='v2', by.y='v1', all.x=T)
out <- out[,-1]

> out
  v1 v3 v4   v2
1 c1 c3 c4   a1
2 e1 e3 e4   a3
3 d1 d3 d4 <NA>

另一个例子,其中df1 $&#34; v1&#34;和df2 $&#34; v2&#34;在任何地方都匹配:

df1 <- data.frame( v1 = c(1,2,1),
                   v2 = c("a1","a2","a3") )

df2 <- data.frame( v1 = c("c1","d1","e1"),
                   v2 = c(1,2,1),
                   v3 = c("c3","d3","e3"),
                   v4 = c("c4","d4","e4") )

out <- merge(df2, df1, by.x='v2', by.y='v1', all.x=T)
out <- out[,-1]

> out
  v1 v3 v4 v2
1 c1 c3 c4 a1
2 c1 c3 c4 a3
3 e1 e3 e4 a1
4 e1 e3 e4 a3
5 d1 d3 d4 a2

以下解决方案不是很优雅,但它适用于以下示例:

f <- function( dF1, match1, data1,
               dF2, match2, data2  )
{
  if ( is.factor(dF1[,data1]) )
  {
    dF2[,data2] <- as.factor(dF2[,data2])
    levels(dF2[,data2]) <- c(levels(dF2[,data2]),levels(dF1[,data1])) 
  }     
  n <- which(dF1[,match1] == dF2[,match2])         
  dF2[n,data2] <- dF1[n,data1]    
  return( dF2 )
}

out <-f1( df1, "v1", "v2", df2, "v2", "v2" )

示例1:

> out
  v1 v2 v3 v4
1 c1 a1 c3 c4
2 d1  5 d3 d4
3 e1 a3 e3 e4

示例2:

> out
  v1 v2 v3 v4
1 c1 a1 c3 c4
2 d1 a2 d3 d4
3 e1 a3 e3 e4

如果输出中不需要df1 $ v1和df2 $ v2不匹配的行,可以通过以下修改删除它们:

f <- function( dF1, match1, data1,
               dF2, match2, data2  )
{
  if ( is.factor(dF1[,data1]) )
  {
    dF2[,data2] <- as.factor(dF2[,data2])
    levels(dF2[,data2]) <- c(levels(dF2[,data2]),levels(dF1[,data1])) 
  }     
  n <- which(dF1[,match1] == dF2[,match2])         
  dF2[n,data2] <- dF1[n,data1]    
  return( dF2[n,] )
}

out <-f1( df1, "v1", "v2", df2, "v2", "v2" )

示例1:

> out
  v1 v2 v3 v4
1 c1 a1 c3 c4
3 e1 a3 e3 e4

在&#39;合并&#39; -solution中,这可以通过&#39; all.x = F&#39;来实现,但是示例2仍然不起作用。