R- 将数据框的行组合成 3 列唯一

R- combine rows of a data frame to be unique by 3 columns

我有这样的数据框:

> head(temp)
      VisitIDCode start stop Value_EVS hr heart rate NU EE0A Value_EVS temp celsius CAL 113C Value_EVS current weight kg CAL
23642  2008253059   695  696                            <NA>                            36.4                            <NA>
24339  2008253059   695  696                             132                            <NA>                            <NA>
72450  2008953178   527  528                            <NA>                            38.6                            <NA>
72957  2008953178   527  528                             123                            <NA>                            <NA>
73976  2008965669   527  528                            <NA>                            36.2                            <NA>
74504  2008965669   527  528                             116                            <NA>                            <NA>

第一行和第二行都是同一位患者(相同的 VisitIDCode),第一行是心率值,第二行是时间 2 到 3 的温度值。我想合并这些行,使结果是一行,如下所示:

      VisitIDCode start stop Value_EVS hr heart rate NU EE0A Value_EVS temp celsius CAL 113C Value_EVS current weight kg CAL
23642  2008253059   695  696                             132                            36.4                            <NA>

换句话说,我希望我的数据框通过 VisitIDCode、start 和 stop 的组合是唯一的。这是一个大型数据框,需要合并更多列。 最好的方法是什么,如果可能的话,避免 for 循环? 编辑:我不想删除 NA。如果有 2 行,每行有一个值和 2 个 NA,我想将它们合并为一行,这样它就有两个值和一个 NA。就像上面的例子。

纳西姆,

发布问题时创建可重现的示例很有用。这使得理清如何提供帮助变得容易得多。我在这里创建了一个玩具示例。希望这能重现您的问题:

> df <- data.frame(MRN = c(123,125,213,214), 
+                  VID = c(2008,2008,2011,2011), 
+                  start=c(695,695), 
+                  heart.rate = c(NA,112,NA,96),
+                  temp = c(39.6,NA,37.4,NA))
> df
  MRN  VID start heart.rate temp
1 123 2008   695         NA 39.6
2 125 2008   695        112   NA
3 213 2011   695         NA 37.4
4 214 2011   695         96   NA

这是一个使用 dplyr 的解决方案:

> library(dplyr)
> df <- df %>% 
+   group_by(VID) %>%
+   summarise(MRN = max(MRN,na.rm=T),
+             start=max(start,na.rm=T),
+             heart.rate=max(heart.rate,na.rm=T),
+             temp = max(temp,na.rm=T))
> df
# A tibble: 2 × 5
    VID   MRN start heart.rate  temp
  <dbl> <dbl> <dbl>      <dbl> <dbl>
1  2008   125   695        112  39.6
2  2011   214   695         96  37.4

在我通过在读取数据时定义列的 类 确保所有列 类 都是数字(而不是因子)之后,这对我有用:

CompleteCoxObs<-aggregate(x=CompleteCoxObs[c("stop","Value_EVS current weight kg CAL","Value_EVS hr heart rate NU EE0A","Value_EVS temp celsius CAL 113C")], by=list(VisitIDCode=CompleteCoxObs$VisitIDCode,start=CompleteCoxObs$start), max, na.rm = FALSE);