我的数据框看起来像这样:
> 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。像上面的例子。
答案 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);