【问题标题】:Modify data.frame column with data and condition from another data.frame [duplicate]使用来自另一个 data.frame 的数据和条件修改 data.frame 列 [重复]
【发布时间】:2018-11-20 13:13:27
【问题描述】:

我有 2 个数据帧

df <- data.frame(addr=c('a','b','c','d'), num = c(1,2,3,4))

> df
  addr num
1    a   1
2    b   2
3    c   3
4    d   4

df2 <- data.frame(addr=c('a','b','d'), num=c(100,200,500))

> df2
  addr num
1    a 100
2    b 200
3    d 500

如果条件 df$addr 与 df2$addr 匹配,我想将 df$num 中的值替换为 df2$num 中的值。我设法用下面的代码得到了这个

 df[,"num"] <- sapply(df[,"addr"], function(x) ifelse(x %in% df2$addr,df2$num[match(x,df2$addr)],df[df$addr==x,]$num))

> df
  addr num
1    a 100
2    b 200
3    c   3
4    d 500

我想知道是否有更优雅的方法使用 dplyr 或 data.table?

【问题讨论】:

  • 在这里使用 data.table 是一种解决方案 setDT(df)[df2, num := ifelse(addr %in% i.addr ,i.num, num), on = "addr"]

标签: r dplyr data.table


【解决方案1】:

您可以使用dplyr 中的left_joinmutate 的组合

编辑

library(dplyr)

df3 <- df %>% 
  left_join(df2,  by = "addr") %>% 
  mutate(num = ifelse(.$num.y %in% df2$num, .$num.y, df$num)) %>% 
  select(addr, num)

df3
# addr num
#1    a 100
#2    b 200
#3    c   3
#4    d 500

旧答案

 df3 <- df %>% 
      mutate(num = ifelse(addr %in% df2$addr, df2$num, num))

df3
#  addr num
#1    a 100
#2    b 200
#3    c   3
#4    d 100

【讨论】:

  • d 应该有 num = 500 而不是 100
  • 我的错误。我更新了我的答案@andrnev
  • 所以我现在有 3 个解决方案。基本 R 版本、data.table 版本和 dplyr 版本。非常感谢。
【解决方案2】:

您可以合并两个表并选择所需的列:

merge(df,df2,'addr',all = T)
#  addr num.x num.y
#1    a     1   100
#2    b     2   200
#3    c     3    NA
#4    d     4   500

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 2020-09-25
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多