【问题标题】:How to add a new column using mutate function from a group of existing columns with similar names如何使用 mutate 函数从一组具有相似名称的现有列中添加新列
【发布时间】:2020-12-03 02:26:47
【问题描述】:

我想根据其他列中的值向我的数据框中添加一列。

这是数据的摘录。

如果 4 个 TOPER 列中的任何一个具有以下任何值(92514、92515、92508、92510、92511 或 92512(我希望 S_Flag 列等于 1,如果不是 @987654324 @ 值应为 0。 突出显示了正确的数据(案例编号 2、4、6 和 8) - 因此应将 S_Flag 设为 1。 尝试在 mutate 函数中使用 ifelse。只是不确定如何识别在ifelse 函数中查看所有 4 TOPER 列??? 试过了

tt <- mutate(rr, S_Flag = ifelse( any(vars(everything()) %in% toper_vec), 1,0))

其中rr 是原始数据框,toper_vec 是包含 6 个 TOPER 列值的向量。

希望这是有道理的。顺便说一句,我正处于学习 R 的早期阶段。 感谢您的帮助。

【问题讨论】:

标签: r dplyr


【解决方案1】:

几个快速修复应该可以让您的代码正常工作: (1) 使用 rowwise() 和 (2) 使用cross()。

修改后的代码如下:

tt <- rr %>%
  rowwise() %>%
  mutate(S_Flag = if_else( any(across(everything()) %in% toper_vec), 1,0))

在以下内容丰富的帖子中解决了类似的问题:Check row wise if value is present in column and update new column row wise

将该帖子中建议的方法应用于您的直接问题,以下应该有效:

library(tidyverse)

toper_vec <- c(92514, 92515, 92508, 92510, 92511, 92512)

df <- data.frame("CASE" = c(1, 2, 3, 4, 5),
                 "TOPER1" = c(86509, 92514, 87659, 45232, 86509),
                 "TOPER2" = c(12341, 10094, 12341, 92508, 10094),
                 "TOPER3" = c(86509, 67326, 41908, 50567, 50567))


new_df <- df %>%
  rowwise() %>%                                   
  mutate(S_Flag = case_when(TOPER1 %in% toper_vec ~ 1,    
                       TOPER2 %in% toper_vec ~ 1,
                       TOPER3 %in% toper_vec ~ 1, 
                       TRUE               ~ 0))

【讨论】:

    【解决方案2】:

    这是一个替代方案,从 Blue050205 重用 toper_vecdf

    df  %>%
      rowwise() %>%
      mutate(s_flag = if_else(any(c_across(starts_with("TOP")) %in% toper_vec), 1, 0))
    

    【讨论】:

    • 非常感谢。真的很有帮助,因为我不知道您可以按行而不是通常的列形式工作。非常感谢您的帮助。很亲切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多