我有两个数据框。要匹配匹配的df1 $ v1和df2 $ v2的内容,请将相应的df2 $ v2内容替换为df1v2内容。
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
在某些情况下,“合并”解决方案会失败,例如,如果df1 $“ v1”和df2 $“ v2”到处都不匹配:
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 $“ v1”和df2 $“ v2”到处都匹配:
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
在“合并”解决方案中,可以通过“ all.x = F”来实现,但是示例2仍然不起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句