R-通过分组行观察折叠数据

时间:2018-12-17 16:34:29

标签: r dataframe dplyr data-analysis data-cleaning

我正在处理住院记录的大型数据框。许多患者有两次或两次以上的住院治疗,并且他们过去的病史可能在一次或多次住院中并不完整。我想将他们每次住院的所有信息汇总到每个患者的医疗问题清单中。

这是一个示例数据框:

> nlines
Simple feature collection with 3 features and 4 fields
geometry type:  LINESTRING
dimension:      XY
bbox:           xmin: 310276 ymin: 5522728 xmax: 333000 ymax: 5530000
epsg (SRID):    26911
proj4string:    +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
   id OBJECTID      PARK_NAME     d_first                       geometry
1 181     2254  Mission Creek  6794.694 m LINESTRING (326528.6 552792...
2 181     1831    Glen Canyon 23859.161 m LINESTRING (310276 5522728,...
3 181     1838 Black Mountain  1260.329 m LINESTRING (331799.6 552961...

哪个出现:

 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

到目前为止,我有一个很好的预感,即整理和分组数据是开始的正确位置,我认为我可以通过为每个医疗问题创建一个新变量来使其起作用。我有大约30个医疗问题,我需要以这种方式崩溃,而如此多的重复代码似乎只是一种隐匿性错误的秘诀。

  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

环顾四周,我一直无法找到一种特别优雅的方式来解决此问题。我忽略了一些精巧的dplyr函数吗?

3 个答案:

答案 0 :(得分:2)

我们可能会使用

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)并返回{{1} },如果在任何行中都有TRUE,则有TRUE

答案 1 :(得分:1)

基本R选项为

aggregate(.~ id, df, any)
#   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

或与rowsum

rowsum(+(df[-1]), group = df$id) > 0

答案 2 :(得分:0)

如果我们更喜欢data.table,我们可以使用:

setDT(df)[, lapply(.SD, any), keyby = id]
    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