【问题标题】:R - replace values conditionally when column names are similarR - 当列名相似时有条件地替换值
【发布时间】:2021-04-21 17:15:32
【问题描述】:

我有一个包含 41 列数据的大型数据框 df。前 40 列具有所有相似的变量名称 TD1、TD2、TD3 .... TD40,其中包含字符。最后一列是 Catflag,其值取决于其他 40 列数据中包含的代码。

这是数据框的一小部分。

TD1 TD2 TD3 ...... TD40 Catflag 1345 4673 3908 2348 行程 4721 9854 5732 O763 糖尿病 5739 6894 3957 5864 心脏 967D 6046 1345 4T67 行程 ......

我想做的是让 R 查看每一行,如果在 40 列数据 (T1-T40) 中的任何位置找到代码 (5984、6046、3331),它将更改/替换 Catflag 中的值将该行改为“手术”。如果它没有找到 3 个值中的任何一个,则该行的 Catflag 值保持不变。因此,在上面的数据框中,只有第 4 行会从“Stroke”变为“Surgery”

我使用以下 R 代码来完成这项工作

逐行()%>% df$Catflag[any(c_across(starts_with("TD")) %in% c("5984", "6046", "3331"))]

它不起作用并得到“无效(NULL)左侧赋值”错误消息。 尝试对命令进行细微的更改和变化,但无济于事。

上述命令适用于多种条件,例如以下示例: df$Catflag[(df$TD1 == "3331") & (df$TD4 == "7856")]

只是不知道如何使它适用于超过 40 列的相同条件???

任何建议将不胜感激。 谢谢

【问题讨论】:

    标签: r dataframe conditional-statements multiple-columns


    【解决方案1】:

    您可以尝试使用lapply,如下所示:

    values_to_check <- c(5984, 6046, 3331)
    cols <- grep('TD', names(df))
    
    df$Catflag[Reduce(`|`, lapply(df[cols], `%in%`, values_to_check))] <- 'Surgery'
    

    dplyr rowwise :

    library(dplyr)
    
    df %>%
      rowwise() %>%
      mutate(Catflag = if(any(c_across(starts_with('TD')) %in% values_to_check)) 
                       'Surgery' else Catflag)
    

    【讨论】:

    • 谢谢@Ronak。如果您不知道 TD1-TD40 的列号,有什么选择?例如,这 40 列是包含数百列数据的非常大的数据框的一部分,您必须使用列名吗?
    • @dapdot1 dplyr 答案应该适用于此。我更新了基础 R 答案。
    • 这似乎行得通。一个问题 - 当您在答案中使用 mutate 函数时,这是否意味着 R 将覆盖原始的 Catflag 数据列?我一直将 mutate 函数关联为向数据框中添加额外的数据列。我的困惑 - 这就是为什么我从来没有想过用它来解决这个问题。非常感谢。
    • Yes mutate 创建一个新列或覆盖现有列(如果存在)。因此,当行中不存在任何 values_to_check 值时,它将返回相同的 Catflag 值。
    • 我可以对原始问题提出一个小的变化。如果 values_to_check 向量不是一组已知的值,即 values_to_check
    猜你喜欢
    • 2016-11-29
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2013-07-13
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多