我有两个数据框。想要匹配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
答案 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仍然不起作用。