我正在处理住院记录的大型数据框架。许多患者曾两次或多次住院,而他们的既往病史在一次或多次住院时可能不完整。我想将他们每次住院的所有信息折叠成每个患者的医疗问题的单一列表。
这是一个示例数据框:
id <- c("123","456","789","101","123","587","456","789")
HTN <- c(TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE,
FALSE)
DM2 <- c(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE)
TIA <- c(TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE)
df <- data.frame(id,HTN,DM2,TIA)
df
结果是:
> df
id HTN DM2 TIA
1 123 TRUE FALSE TRUE
2 456 FALSE FALSE TRUE
3 789 FALSE TRUE TRUE
4 101 FALSE TRUE TRUE
5 123 FALSE FALSE FALSE
6 587 TRUE TRUE TRUE
7 456 FALSE FALSE TRUE
8 789 FALSE TRUE TRUE
我希望我的输出如下所示:
id <- c("101","123","456","587","789")
HTN <- c(FALSE,TRUE,FALSE,TRUE,FALSE)
DM2 <- c(TRUE,FALSE,FALSE,TRUE,TRUE)
TIA <- c(TRUE,TRUE,TRUE,TRUE,TRUE)
df2 <- data.frame(id,HTN,DM2,TIA)
df2
id HTN DM2 TIA
1 101 FALSE TRUE TRUE
2 123 TRUE FALSE TRUE
3 456 FALSE FALSE TRUE
4 587 TRUE TRUE TRUE
5 789 FALSE TRUE TRUE
到目前为止,我有一个很好的预感,即安排和分组我的数据是正确的起点,并且我认为我可以通过为每个医疗问题创建一个新变量来使其发挥作用。不过,我有大约 30 个医疗问题,我需要以这种方式崩溃,而且这么多重复的代码似乎会导致神秘错误。
df3 <- df %>%
arrange(id) %>%
group_by(id)
环顾四周,我还没有找到一种特别优雅的方法来解决这个问题。是否有一些我忽略的巧妙的 dplyr 函数?
最佳答案
我们可能会使用
df %>% group_by(id) %>% summarize_all(any)
# A tibble: 5 x 4
# id HTN DM2 TIA
# <fct> <lgl> <lgl> <lgl>
# 1 101 FALSE TRUE TRUE
# 2 123 TRUE FALSE TRUE
# 3 456 FALSE FALSE TRUE
# 4 587 TRUE TRUE TRUE
# 5 789 FALSE TRUE TRUE
通过这种方式,我们首先确实按照 id
进行分组,正如您所建议的那样。然后我们使用函数 summarize
对变量进行 all
any
:我们提供一个逻辑向量(例如,患者 HTN
的 101
),如果在任何行中我们有 TRUE
和 TRUE
,则返回 FALSE
。
关于R - 按分组行观察折叠数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53819374/