我在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” ,依此类推,但没有一个。 如何解决此问题并将变量仅更改为一列?
谢谢。
答案 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]