我有一个关于诊断的信息:
data <- tibble(
id = c(1:10),
diagnosis_1 = c("F32", "F431", "R58", "S32", "F11", NA, NA, "Y67", "F32", "Z032"),
diagnosis_2 = c(NA, NA, NA, NA, NA, NA, "G35", NA, NA, NA),
diagnosis_3 = c("F40", NA, "R67", "F431", NA, "F60", "S58", "R68", "F11", NA),
diagnosis_4 = c(NA, NA, "F65", NA, "F19", NA, NA, "F32", NA, NA)
)
作为清理过程的一部分,我删除了所有不符合特定标准的诊断(即不是以字母F、G或Z开头的诊断)。
data$diagnosis_1[str_sub(data$diagnosis_1, 1,1) %in% c("R", "S", "Y")] <- NA
data$diagnosis_2[str_sub(data$diagnosis_2, 1,1) %in% c("R", "S", "Y")] <- NA
data$diagnosis_3[str_sub(data$diagnosis_3, 1,1) %in% c("R", "S", "Y")] <- NA
data$diagnosis_4[str_sub(data$diagnosis_4, 1,1) %in% c("R", "S", "Y")] <- NA
以这句话结尾:
现在我需要把数据移到左边来填充从左到右的列(例如,如果diagnosis_2,diagnosis_3或diagnosis_4有数据,diagnosis_1就不为空).我试过使用ifelse(),因为它是矢量化的,但是我似乎不能让它和几个嵌套的ifelse()一起工作.
ifelse(is.na(data$diagnosis_1), data$diagnosis_2, data$diagnosis_1))
非常感谢所有建议。
编辑:添加预期输出:
6条答案
按热度按时间lnxxn5zx1#
使用 dplyr 和 tidyr。从宽到长重新整形,排除
"^RSY"
和NA
诊断,从长到宽重新整形。jecbmhm32#
我们首先将以“R”、“S”或“Y”开头的
replace
值移到NA
,然后左移非NA值。将非NA值左移取自大卫对here的回答,您也可以尝试任何其他方法来将同一问题的值左移。
aydmsdu93#
你可以试试
tidyverse
由于不清楚OP想要什么(见下面的讨论),您也可以尝试
tcomlyy64#
您可以将
Reduce
与dplyr
中的coalesce
沿着使用,即62lalag45#
下面的解决方案使用来自
dedupewider
包的函数na_move
。a6b3iqyw6#
使用
pivot_longer
和unnest_wider
的tidyr更新。第一步:清理数据
步骤2:左紧数据
数据