首页 > 解决方案 > R - 当列名相似时有条件地替换值

问题描述

我有一个包含 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 代码来完成这项工作

rowwise()%>% df$Catflag[any(c_across(starts_with("TD")) %in% c("5984", "6046", "3331"))] <- "手术"

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

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

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

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

标签: rdataframeconditional-statementsmultiple-columns

解决方案


您可以尝试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)

推荐阅读