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

安特斯

我有两个数据框。要匹配匹配的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
mra68

在某些情况下,“合并”解决方案会失败,例如,如果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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据多个条件用第二个数据帧中的值替换数据帧中的 NA

当第二个数据帧中存在匹配值时,替换数据帧列的值

根据第二个数据帧汇总一个数据帧

如何根据单独数据帧中列值的存在过滤数据帧的行并从第二个数据帧追加列

根据第二个数据帧中 2 列中的值,为第一个数据帧中的某些列添加后缀

根据不同数据帧中的值重新编码第二个数据帧中的值

如果根据索引匹配第二个数据帧,则删除数据帧中的行

根据第二个数据帧中的值从数据帧中选择值而不循环

R根据标题名称将列与第二个数据帧中的值相乘

用R中第二个数据帧中的列值替换数据帧中三列的每个值

根据3列比较2个数据帧并更新第二个数据

基于第二个数据帧中的值的子集数据帧

R将列乘以第二个数据帧中的值

合并第二个数据帧中仅包含一列的数据帧

在R中,如何根据第二个数据帧中的组保留一个数据帧中的所有行?

将一个数据帧中的NA值替换为第二个数据帧中的值

根据第二个数据帧中的日期范围对一个数据帧中的值求和

R:重命名第二个数据帧的数据功能中的列(无盲数据)

在第二个数据帧中映射负值,保留坐标并替换第一个数据帧

R根据另一个中的值搜索第二个数据帧

如何为第一个数据帧中匹配的特定列值的所有值获取第二个数据帧的数据?

R 替换值,如果它匹配第二个数据帧中的值

有条件地用第二个数据帧中的值替换数据帧中的值

如何有效地根据与包含每个 ID 条件的第二个数据帧相对应的 ID 列过滤数据帧?

比较两个不相等的数据帧,并根据第二个数据帧从其中一个数据帧替换字符串

根据第二个数据框列中的匹配替换“数据框列”中的值

使用R中的匹配将列的子集乘以第二个数据帧中的值

比较 1 个数据帧中多列的内容,并将布尔值输出到第二个数据帧

从 R 中的第二个数据帧有条件地更新数据帧