【问题标题】:R- combine rows of a data frame to be unique by 3 columnsR- 将数据框的行组合成 3 列唯一
【发布时间】:2017-05-19 20:38:45
【问题描述】:

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

> 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。就像上面的例子。

【问题讨论】:

标签: r dataframe row unique


【解决方案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

【讨论】:

  • 顺便说一句,当它在由某个 VID 分组的所有行中时,这将保留 NA
  • 非常感谢。那些具有非数字值的列呢? Max() 不适用于这些。
  • 我在数据框中看不到任何非数字值,但是当我运行您建议的代码时,我收到此错误:summarise_impl(.data, dots) 中的错误:'max'对因素没有意义
  • max 适用于字符向量 max("A","B") = "B"。由于 plyr 冲突,我遇到了 dplyr 错误问题。尝试 dplyr::group_by 和 dplyr::summarise。如果失败,请尝试将 stringsAsFactors = F 添加到 data.frame 语句中。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2012-01-11
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多