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);
我有这样的数据框:
> 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);