【发布时间】:2021-10-11 08:04:21
【问题描述】:
我有两个数据框 - 一个包含名称和限制范围(只有几百行,最多 1000 行),需要将其分配给可以包含数百万行(或数十行)的“测量”数据框百万行)。
目前我正在做 left_join 和过滤值以获得分配给每个测量的特定限制。然而,这非常低效并且耗费大量资源。对于较大的数据帧,代码甚至无法运行。
任何关于更有效解决方案的想法都会有所帮助。
library(dplyr)
## this one has got only few houndreds rows
df_limits <- read.table(text="Title station_id limit_from limit_to
Level_3_Low 1 0 70
Level_2_Low 1 70 90
Level_1_Low 1 90 100
Optimal 1 100 110
Level_1_High 1 110 130
Level_2_High 1 130 150
Level_3_High 1 150 180
Level_3_Low 2 0 70
Level_2_Low 2 70 90
Level_1_Low 2 90 100
Optimal 2 100 110
Level_1_High 2 110 130
Level_2_High 2 130 150
Level_3_High 2 150 180
Level_3_Low 3 0 70
Level_2_Low 3 70 90
Level_1_Low 3 90 100
Optimal 3 100 110
Level_1_High 3 110 130
Level_2_High 3 130 150
Level_3_High 3 150 180
",header = TRUE, stringsAsFactors = TRUE)
# this DF has got millions of rows
df_measurements <- read.table(text="measurement_id station_id value
12121534 1 172
12121618 1 87
12121703 1 9
12121709 2 80
12121760 2 80
12121813 2 115
12121881 3 67
12121907 3 100
12121920 3 108
12121979 1 102
12121995 1 53
12122022 1 77
12122065 2 158
12122107 2 144
12122113 2 5
12122135 3 100
12122187 3 136
12122267 3 130
12122359 1 105
12122366 1 126
12122398 1 143
",header = TRUE, stringsAsFactors = TRUE)
df_results <- left_join(df_measurements,df_limits, by = "station_id") %>%
filter ((value >= limit_from & value < limit_to) | is.na(Title)) %>%
select(names(df_measurements), Title)
【问题讨论】:
-
您是否尝试过这篇文章中的
data.table解决方案? stackoverflow.com/questions/24480031/… -
我已经尝试过fuzzy_left_join。 data.table 解决方案似乎对我不起作用,我正在尝试: df_measurements[df_limits, .(x, station_id=x.station_id, limit_from, limit_to), on=.(x, value>=limit_from, value
-
我也试过这个:df_measurements[df_limits, .(station_id, value=x.value, limit_from, limit_to) , on=.(station_id, value>=limit_from, value
-
@Petrik 你的第二次尝试出了什么问题(使用
data.table)?
标签: r database data.table left-join