通过左连接同时合并多个数据帧会导致RStudio崩溃

时间:2018-07-20 11:44:00

标签: r dplyr left-join rstudio tidyverse

我想使用left_join库中的dplyr合并三个大数据框。数据帧具有相同的结构,它们具有9859个观测值和4个变量,只有第四个不同。最后,我需要的是一个具有六列(3个共享变量和3个不同变量)的数据框。

过去我可以使用“ tidyverse”和“ dplyr”来完成此操作,但现在RStudio不断崩溃并冻结了我的笔记本电脑。另外,我可以在前两个数据帧中使用left_join,但在加入第三个数据帧时不能使用。

我能够对多个数据帧执行'left_join',我认为这可能与我的数据有关,但我不知道是什么。您可以使用三个数据帧here

下载文件
sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

数据帧似乎具有相同的结构

str(df.u)
'data.frame':   9859 obs. of  4 variables:
 $ event_id : num  3.51e+09 3.51e+09 3.51e+09 3.51e+09 3.51e+09 ...
 $ timestamp: POSIXct, format: "2017-08-08 20:38:37" "2017-08-08 20:38:37" "2017-08-08 20:38:37" "2017-08-08 20:38:37" ...
 $ raster.id: chr  "2017-08-08_20_40_10" "2017-08-08_20_40_10" "2017-08-08_20_40_10" "2017-08-08_20_40_10" ...
 $ u_wind   : num  -1.28 -1.3 -1.31 -1.32 -1.32 ...
str(df.v)
'data.frame':   9859 obs. of  4 variables:
 $ event_id : num  3.51e+09 3.51e+09 3.51e+09 3.51e+09 3.51e+09 ...
 $ timestamp: POSIXct, format: "2017-08-08 20:38:37" "2017-08-08 20:38:37" "2017-08-08 20:38:37" "2017-08-08 20:38:37" ...
 $ raster.id: chr  "2017-08-08_20_40_10" "2017-08-08_20_40_10" "2017-08-08_20_40_10" "2017-08-08_20_40_10" ...
 $ v_wind   : num  -1.52 -1.53 -1.53 -1.54 -1.54 ...
str(df.w)
'data.frame':   9859 obs. of  4 variables:
 $ event_id : num  3.51e+09 3.51e+09 3.51e+09 3.51e+09 3.51e+09 ...
 $ timestamp: POSIXct, format: "2017-08-08 20:38:37" "2017-08-08 20:38:37" "2017-08-08 20:38:37" "2017-08-08 20:38:37" ...
 $ raster.id: chr  "2017-08-08_20_40_10" "2017-08-08_20_40_10" "2017-08-08_20_40_10" "2017-08-08_20_40_10" ...
 $ w_wind   : num  -0.02343 -0.00834 0.00273 0.01357 0.01842 ...

这是到目前为止我尝试过的代码,什么有效,哪些崩溃:

library(tidyverse)
# this craches 
dat.wind <- left_join(df.u, df.v, by=c('event_id', 'timestamp', 'raster.id')) %>% left_join(dat.wind, df.w, by=c('event_id', 'timestamp', 'raster.id'))

如果我分两步完成,第一个不会崩溃,但是第二个会崩溃:

dat.wind <- left_join(df.u, df.v, by=c('event_id', 'timestamp', 'raster.id')) # doesn't crash
dat.wind2 <- left_join(dat.wind, df.v, by=c('event_id', 'timestamp', 'raster.id')) # crashes

我还尝试过转换为列表并使用Paul Rougieux here

提出的解决方案
list(df.u, df.f, df.w) %>% reduce(left_join, by=c('event_id', 'timestamp', 'raster.id')) # also crahses

在这种情况下,我可以简单地使用数据框函数来获得所需的结果,但这是循环的一部分,并且可能变得更加复杂。

dat.wind <- data.frame('event_id' = df.u$event_id, 'timestamp' = df.u$timestamp, 'raster.id' = df.u$raster.id, 'u_wind' = df.u$u_wind, 'v_wind' = df.v$v_wind, 'w_wind' = df.w$w_wind)
# this is what I want
head(dat.wind)
    event_id           timestamp           raster.id    u_wind    v_wind       w_wind
1 3512002602 2017-08-08 20:38:37 2017-08-08_20_40_10 -1.277772 -1.520014 -0.023433736
2 3512002602 2017-08-08 20:38:37 2017-08-08_20_40_10 -1.295119 -1.526865 -0.008342839
3 3512002602 2017-08-08 20:38:37 2017-08-08_20_40_10 -1.305293 -1.531078  0.002726094
4 3512002602 2017-08-08 20:38:37 2017-08-08_20_40_10 -1.317489 -1.535781  0.013570182
5 3512002602 2017-08-08 20:38:37 2017-08-08_20_40_10 -1.324802 -1.538454  0.018419913
6 3512002602 2017-08-08 20:38:37 2017-08-08_20_40_10 -1.326861 -1.539239  0.019975858

2 个答案:

答案 0 :(得分:0)

要在Jake's comment上进行扩展,这实际上不是left_join的用例,因为没有ID列对于每一行都不同。如果尝试进行此匹配,则将发生的情况是第一个数据帧中的每一行将与9859条其他行进行匹配,然后97,199,881行中的每一行将尝试与第三次匹配中的9859行进行匹配。相反,如果您想继续使用管道,则可以使用bind_colsmutate来复制列。或者,如果您确实要使用left_join,则可以向每个数据框添加一个行ID列,以使每行与众不同,然后将其删除:

当然,如果不希望前三列只有一个不同的值,那么请检查您的数据源!

df.u %>%
  bind_cols(df.v['v_wind'], df.w['w_wind'])
df.u %>%
  mutate(v_wind = df.v$v_wind, w_wind = df.w$w_wind)
df.u %>%
  rowid_to_column() %>%
  left_join(rowid_to_column(df.v), by = c('rowid', 'event_id', 'timestamp', 'raster.id')) %>%
  left_join(rowid_to_column(df.w), by = c('rowid', 'event_id', 'timestamp', 'raster.id')) %>%
  select(-rowid)

答案 1 :(得分:0)

您可以尝试:

jdfs <-join_all(list(dfs),by =“”,type ='left',match =“ first”)