我想使用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
答案 0 :(得分:0)
要在Jake's comment上进行扩展,这实际上不是left_join
的用例,因为没有ID列对于每一行都不同。如果尝试进行此匹配,则将发生的情况是第一个数据帧中的每一行将与9859条其他行进行匹配,然后97,199,881行中的每一行将尝试与第三次匹配中的9859行进行匹配。相反,如果您想继续使用管道,则可以使用bind_cols
或mutate
来复制列。或者,如果您确实要使用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”)