我有两个小标题,范围和地点。第一个包含一组坐标(区域,开始,结束以及其他字符变量),另一个包含一个地点(区域,地点)。我需要获得第二个小标题中所有落在给定范围(行)内的所有站点。复杂的是,第一个小标题的范围重叠。
# Range tibble
region start end var_1 ... var_n
1 A 1 5
2 A 3 10
3 B 20 100
# Site tibble
region site
1 A 4
2 A 8
3 B 25
〜200,000个范围可能在大约十亿个站点上长达100,000个,所以我不喜欢我的想法,该方案会列出范围内的所有值,并进行嵌套,半联接,分组和汇总(a_list = list(site))”。
我希望有以下类似的东西:
range_tibble %>%
rowwise %>%
mutate(site_list = site_tibble %>%
filter(region.site == region.range, site > start, site < end) %>%
.$site %>% as.list))
产生像这样的小标题
# Final tibble
region start end site_list var_1 ... var_n
<chr> <dbl> <dbl> <list> <chr> <chr>
1 A 1 5 <dbl [1]>
2 A 3 10 <dbl [2]>
3 B 20 100 <dbl [1]>
我已经看到了使用“获取”外部变量(例如filter(b == get(“ b”)))的答案,但是如何从当前行中的变量中获取该变量呢?或我没有想到的语法?完全不同的方法也很好,只要它可以很好地处理大数据并且可以转换为小标题。
答案 0 :(得分:0)
数据
range <- data.frame(region = c("A", "A", "B"), start = c(1, 3, 20), end = c(5, 10, 100))
site <- data.frame(region = c("A", "A", "B"), site = c(4, 8, 25))
代码
使用left_join()
合并两个数据帧和summarise()
来连接包含在指定范围内的位点。
range %>% left_join(site) %>%
filter(site >= start & site <= end) %>%
group_by(region, start, end) %>%
summarise(site = list(site))
# region start end site
# <fct> <dbl> <dbl> <list>
# 1 A 1 5 <dbl [1]>
# 2 A 3 10 <dbl [2]>
# 3 B 20 100 <dbl [1]>