R - 当列名相似时有条件地替换值
R - replace values conditionally when column names are similar
我有一个包含 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),它将 change/replace该行的 Catflag 中的值设置为“Surgery”。如果它没有找到 3 个值中的任何一个,则该行的 Catflag 值保持不变。因此,在上面的数据框中,只有第 4 行会从“中风”变为“手术”
我使用了以下 R 代码来完成这项工作
行向()%>%
df$Catflag[any(c_across(starts_with("TD")) %in% c("5984", "6046", "3331"))] <- "手术"
它没有工作并收到“分配的左侧无效(NULL)”错误消息。
尝试对命令进行细微的更改和变化但无济于事。
以上命令适用于多种情况,例如此示例:
df$Catflag[(df$TD1 == "3331") & (df$TD4 == "7856")] <- "紧急"
只是不知道如何让它在 40 列上应用相同的条件???
如有任何建议,我们将不胜感激。
谢谢
您可以尝试使用 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)
我有一个包含 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),它将 change/replace该行的 Catflag 中的值设置为“Surgery”。如果它没有找到 3 个值中的任何一个,则该行的 Catflag 值保持不变。因此,在上面的数据框中,只有第 4 行会从“中风”变为“手术”
我使用了以下 R 代码来完成这项工作
行向()%>% df$Catflag[any(c_across(starts_with("TD")) %in% c("5984", "6046", "3331"))] <- "手术"
它没有工作并收到“分配的左侧无效(NULL)”错误消息。 尝试对命令进行细微的更改和变化但无济于事。
以上命令适用于多种情况,例如此示例: df$Catflag[(df$TD1 == "3331") & (df$TD4 == "7856")] <- "紧急"
只是不知道如何让它在 40 列上应用相同的条件???
如有任何建议,我们将不胜感激。 谢谢
您可以尝试使用 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)