是否使用来自另一个数据帧的起始点和终止点对另一个数据帧进行子集? [英] Subset a dataframe using start and stop points from another dataframe?

查看:25
本文介绍了是否使用来自另一个数据帧的起始点和终止点对另一个数据帧进行子集?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数据帧DF,第一列和最后一列ID分别为3列

id <- c(27,27,134,134)
first <- c(14,20,9,16)
last <- c(17,24,13,20)
df <- as.data.frame(cbind(id,first,last))
df
每行对应于我想要保留的另一个数据帧中的一个数据块。 First和Last表示相关块的第一帧和最后一帧 我想使用它来子集另一个数据帧数据,它的结构如下

dat_id <- c(rep(27, 30), rep(134,30))
dat_frame <- c(seq(1:30), seq(1:30))
dat_data <- c(sample(1:60))

dat <- as.data.frame(cbind(dat_id,dat_frame,dat_data))
dat

我知道提取相关部分的唯一方法是使用如下所示的for循环(这会产生预期的输出),但我认为这是一种非常低效的方法。有什么更好的方法吗?

#header row
new_df <- data.frame(id = numeric(), frame = numeric(), data = numeric())

#populate
for (i in (seq (1:nrow(df)))){
    new_df <- rbind(new_df, subset(dat, dat_id == df[i,"id"])[df[i,"first"]:df[i,"last"],])
}

new_df

推荐答案

使用dplyr,我们可以对datdf执行left_join操作,并仅选择位于其各自idbetweenfirstlast中的那些行。

library(dplyr)

left_join(dat, df, by = c("dat_id" = "id")) %>%
   filter(between(dat_frame, first, last)) %>%
   select(-first, -last)

或在基本R中使用相同的逻辑

subset(merge(dat, df, by.x = "dat_id", by.y = "id", all.x = TRUE), 
             dat_frame >= first & dat_frame <= last)

这篇关于是否使用来自另一个数据帧的起始点和终止点对另一个数据帧进行子集?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆