R-将数据帧的行组合为3列唯一

时间:2017-05-19 20:38:45

标签: r dataframe row unique

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

> 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来使我的数据帧是唯一的。这是一个大型数据框,需要组合更多列。 这样做的最佳方式是什么,如果可能的话,避免循环? 编辑:我不想删除NA。如果有2行,每行有一个值和2个NA,我想将它们组合成一行,因此它有两个值和一个NA。像上面的例子。

2 个答案:

答案 0 :(得分:1)

纳西姆,

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

> 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

答案 1 :(得分:0)

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

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);