R根据单独 Dataframe 中的匹配索引列替换 Dataframe 中的列值

46qrfjad  于 2022-12-20  发布在  其他
关注(0)|答案(4)|浏览(148)

我有一个 Dataframe “df 1”,如下所示:
| 人数|变量1|变量|变量3|
| - ------|- ------|- ------|- ------|
| 1个|A类|B| C级|
| 第二章|A类|B| C级|
| 三个|A类|B| C级|
| 四个|A类|B| C级|
| 五个|A类|B| C级|
我有第二个 Dataframe “df 2”,如下所示:
| 人数|变量1|变量|变量3|
| - ------|- ------|- ------|- ------|
| 1个|D级|E级|F级|
| 第二章|G级|高|我|
| 三个|J型|K| L型|
| 四个|男|数量|O型|
| 十五|P级|Q值|右|
我想根据Number中的匹配值,用df 2中Variable列中的数据更新df 1中的三个Variable列,这样df 1最终看起来就像:
| 人数|变量1|变量|变量3|
| - ------|- ------|- ------|- ------|
| 1个|D级|E级|F级|
| 第二章|G级|高|我|
| 三个|J型|K| L型|
| 四个|男|数量|O型|
| 五个|A类|B| C级|

83qze16e

83qze16e1#

您可以将powerjoin包中的power_left_joinconflict = coalesce_yx一起使用,如下所示:

library(powerjoin)
power_left_join(df1, df2, by = "Number", conflict = coalesce_yx)
#>   Number Variable1 Variable Variable3
#> 1      1         D        E         F
#> 2      2         G        H         I
#> 3      3         J        K         L
#> 4      4         M        N         O
#> 5      5         A        B         C

创建于2022年12月13日,使用reprex v2.0.2

数据:

df1 <- read.table(text = 'Number    Variable1   Variable    Variable3
1   A   B   C
2   A   B   C
3   A   B   C
4   A   B   C
5   A   B   C
', header = TRUE)

df2 <- read.table(text = 'Number    Variable1   Variable    Variable3
1   D   E   F
2   G   H   I
3   J   K   L
4   M   N   O
15  P   Q   R
', header = TRUE)
btxsgosb

btxsgosb2#

如果dput(df)已完成,则会很有帮助。已创建另一个数据集用于复制

df1<-cbind.data.frame(id=c(1:5),var1=rep("A",5),var2=rep("B",5),var3=rep("C",5))

df2<-cbind.data.frame(id=c(1:4,15),var1=LETTERS[7:11],var2=LETTERS[12:16],var3=LETTERS[16:20])

df1 %>%
  left_join(df2, by = "id") %>%
  mutate(var1 = coalesce(var1.y, var1.x),
         var2 = coalesce(var2.y, var2.x),
         var3 = coalesce(var3.y, var3.x)) %>%
  select(-var1.y, -var1.x,
         -var2.y, -var2.x,
         -var3.y, -var3.x)
vatpfxk5

vatpfxk53#

对于dplyr,我们可以使用

library(dplyr)
rows_update(df1, df2, by = 'Number', unmatched = "ignore")
  • 输出
Number Variable1 Variable Variable3
1      1         D        E         F
2      2         G        H         I
3      3         J        K         L
4      4         M        N         O
5      5         A        B         C
643ylb08

643ylb084#

您可以在使用data.table包和fcoalesce函数连接时更新df1:

library(data.table)

cols = c("Variable1", "Variable", "Variable3")

setDT(df1)[df2, (cols) := Map(fcoalesce, mget(paste0("i.", cols)), mget(cols)), on="Number"]
    

   Number Variable1 Variable Variable3
    <int>    <char>   <char>    <char>
1:      1         D        E         F
2:      2         G        H         I
3:      3         J        K         L
4:      4         M        N         O
5:      5         A        B         C

相关问题