从多个列中选择任何非NA变量,以将其突变为新列中的统一变量

时间:2019-11-27 17:55:55

标签: r tidyverse

我在R-Studio中使用 tidyverse ,并具有一个数据框(df),其中包含多个变量和患者的观察结果。
有一些列,其中包含7种不同症状的字符串变量。这些列也包含NA。一些观察结果具有多个正变量。 这是表格的前10行和4列:

symptom_1      symptom_2      symptom_3      symptom_4
1       <NA>           <NA> SYMPTOM'S NAME SYMPTOM'S NAME
2       <NA> SYMPTOM'S NAME           <NA> SYMPTOM'S NAME
3       <NA>           <NA>           <NA>           <NA>
4       <NA>           <NA>           <NA>           <NA>
5       <NA>           <NA>           <NA>           <NA>
6       <NA>           <NA>           <NA>           <NA>
7       <NA>           <NA>           <NA>           <NA>
8       <NA>           <NA>           <NA>           <NA>
9       <NA>           <NA>           <NA>           <NA>
10      <NA>           <NA>           <NA>           <NA>

我想建立一个新的因子列,对于那些具有至少1个变量(症状)的观察,应包含“正”,对于所有症状均包含“ NA”的情况,应包含“ NA”。即对于情况1和2,列应包含“正”,对于情况3至10,列应包含“不适用”。 我已经在当前资源中搜索了解决方案,尝试了不同的建议,并且最接近我期望的结果是:

df<-
df %>% 
select(symptom_1:symptom_7) %>% 
mutate_if(is.character, funs(any_positive=ifelse(!is.na(.), "Positive", .)))

但是此代码又产生了14列,分别为“ symptom_1_any_positive” “ symptom_2_any_positive” “ symptom_3_any_positive” ,依此类推,但没有一个。 如何解决此问题并将变量仅更改为一列?

谢谢。

1 个答案:

答案 0 :(得分:0)

我们可以在逻辑矩阵上使用rowSums

nm1 <- grep("^symptom_\\d+$", names(df))
df$newcol <- c(NA, "Positive")[(rowSums(!is.na(df[nm1])) > 0) + 1]

如果还有负值,并且想要检查正值,则为

df$newcol <- c(NA, "Positive")[(rowSums(df[nm1] > 0 & !is.na(df[nm1])) >0) + 1]