如何基于R中的特定参数合并行

时间:2019-04-09 10:47:37

标签: r

我有一个看起来像这样的数据框:

   ID Smoker Asthma  Age Sex COPD Event_Date
1   1      0      0  65   M    0   12-2009
2   1      0      1  65   M    0   21-2009
3   1      0      1  65   M    0   23-2009
4   2      1      0  67   M    0   19-2010
5   2      1      0  67   M    0   21-2010
6   2      1      1  67   M    1   01-2011
7   2      1      1  67   M    1   02-2011
8   3      2      1  77   F    0   09-2015
9   3      2      1  77   F    1   10-2015
10  3      2      1  77   F    1   10-2015

我想知道是否有可能将我的行合并以获得这样的数据集:

  ID Smoker   Asthma  Age Sex  COPD  Event_Data
    1   0      1      65   M   0      12-2009
    2   1      1      66   M   1      19-2010
    3   2      1      77   F   1      09-2015

我尝试使用唯一功能,但这并不能提供所需的输出,并且会重复显示ID用于多行。

这是我尝试过的代码的一个示例

Data2<-unique(Data)

我不只想要第一行,因为我想包括每一列的状态。例如,仅获取第一行将不包括针对每个ID的后几行中出现的COPD状态。

3 个答案:

答案 0 :(得分:0)

如果要获取每个ID的(第一行),可以尝试执行以下操作:

d <- structure(list(ID         = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), 
                    Smoker     = c(0L, 0L, 0L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), 
                    Asthma     = c(0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L), 
                    Age        = c(65L, 65L, 65L, 67L, 67L, 67L, 67L, 77L, 77L, 77L), 
                    Sex        = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L), 
                                       .Label = c("F", "M"), class = "factor"), 
                    COPD       = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L), 
                    Event_Date = structure(c(5L, 7L, 9L, 6L, 8L, 1L, 2L, 3L, 4L, 4L), 
                                           .Label = c("01-2011", "02-2011", "09-2015", 
                                                      "10-2015", "12-2009", "19-2010", 
                                                      "21-2009", "21-2010", "23-2009"), 
                                           class = "factor")), 
                class = "data.frame", 
                row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"))


d[!duplicated(d$ID), ]

#   ID Smoker Asthma Age Sex COPD Event_Date
# 1  1      0      0  65   M    0    12-2009
# 4  2      1      0  67   M    0    19-2010
# 8  3      2      1  77   F    0    09-2015

答案 1 :(得分:0)

当您需要进一步降低值时,请使用max,对于其他值,请使用dplyr::first,此处为示例

library(dplyr)
df %>% group_by(ID) %>% summarise(Smoker=first(Smoker), Asthma=max(Asthma, na.rm = TRUE))

答案 2 :(得分:0)

替代解决方案:

library(dplyr)

d %>%
  group_by(ID, Age, Sex, Smoker) %>%
  summarise(Asthma = !is.na(match(1, Asthma)),
            COPD = !is.na(match(1, COPD)),
            Event_Date = first(Event_Date)) %>%
  ungroup %>%
  mutate_if(is.logical, as.numeric)


# A tibble: 3 x 7
     ID   Age Sex   Smoker Asthma  COPD Event_Date
  <int> <int> <fct>  <int>  <dbl> <dbl> <fct>     
1     1    65 M          0      1     0 12-2009   
2     2    67 M          1      1     1 19-2010   
3     3    77 F          2      1     1 09-2015