【问题标题】:Change column based on other two columns根据其他两列更改列
【发布时间】:2021-10-26 07:26:27
【问题描述】:

我有一个如下的数据框:

df <- data.frame(matrix(NA, nrow = 5, ncol = 1))
colnames(df) <- "father"
df$father <- c("A", "B", "B","C","D")
df$id <- c("C", "E","F","G","H")
df$pop <- c("ref","ref","ref","val","val")

这给出了:

  father id pop
1      A  C ref
2      B  E ref
3      B  F ref
4      C  G val
5      D  H val

那么如果“id”出现在“father”中,pop的值应该是出现在father所在行的那个。 例如在这个例子中“C”出现在“father”和“id”中,在father C中pop是val,那么,我希望C的pop作为id是val,如下所示:

  father id pop
1      A  C val 
2      B  E ref
3      B  F ref
4      C  G val
5      D  H val

有什么想法吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以试试下面的

    require(dplyr)
    require(magrittr)
    
    merge(x = df,
          y = df,
          by.x = 'id',
          by.y = 'father',
          all.x = T) %>% 
      mutate(., pop = ifelse(is.na(pop.y), pop.x, pop.y)) %>%
      subset(., select = c('father', 'id', 'pop'))
    

    想法是通过merge(自all.x=T)对其自身执行左连接,并通过mutate 选择想要的值。

    【讨论】:

    • 谢谢!有用!此外,如果有重复的 id,我们应该添加一行来删除重复项 :) 例如,如果新的数据框称为“populations”,我们应该应用:populations = population[!duplicated(populations$id),]跨度>
    • @ana_gg 如果在您的示例中,idB?例如,df$id &lt;- c("B", "E","F","G","H")?你会分配哪个pop 值?除非它们始终相同,否则是的,如您所说,会出现重复的条目!
    • 感谢您的评论。我已经调整了这个例子,它永远不会发生。父亲的所有“id”总是分配给相同的群体:)
    • @runr code golf :如果您不需要来自magrittr 的任何其他运算符,例如%&lt;&gt;%,则不必附加magrittr。附加dplyr 会同时带来%&gt;%,并且可以使用dplyr 中的left_join 代替merge,以提高可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2018-09-06
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多