【发布时间】:2020-07-12 17:56:52
【问题描述】:
我正在尝试根据另一个数据报中的列过滤数据帧的行。基本上,我想提取位置在开始和结束之间的具有相同 ID 的行。还有一个额外的技巧是 ID 的格式不同。
最后,脚本中涉及的数据量很大,因此无论是节省内存还是速度都很好。
将不胜感激得到一些提示。
library(dplyr)
df1 <- data.frame(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
pos = c(30, 40, 50, 35, 45, 55, 60, 63, 39))
df2 <- data.frame(idstr = c("id1", "id1", "id3", "id4", "id4"),
start=c(30, 20, 30, 40, 20 ),
end = c(40, 30, 50, 60, 45))
df.base <- df1[ paste0("id", df1$id) == df2$idstr &&
df1$pos >= df2$start &&
df1$pos <= df2$end,]
df.dplyr <- df1 %>%
left_join(df2, by = c('id' == 'idstr') ) %>%
filter(pos >= start & pos <= end) %>%
select(id, pos)
编辑:
预期输出,来自 df1 的行满足条件(它们的位置在具有相同 id 的 df2 范围内),所以如果没有错误:
身份,位置
1、30
1、40
3、39
解释:例如,df1[3,] id == 1 和 pos == 50 查看 df2,没有 df2$id == "id1" 且 df2$start = 50 的行,因此 df1[3,] 将被过滤掉。
【问题讨论】: