是否有任何函数可以从R中的数据帧中提取多行(非连续)?

是否有任何函数可以从R中的数据帧中提取多行(非连续)?,r,dataframe,R,Dataframe,我试图从数据帧中提取几行(不是一行接一行)。应删除的行范围位于另一个数据帧中 我尝试使用for循环提取行,但不幸的是,只删除了最后一个范围 这是我使用的代码行(在“for”循环中,而“I”是变量): 这是数据帧(erase_df),包括我要删除的行的范围(“开始”向量表示应删除第一个行范围,“停止”向量表示应删除该范围内的最后一行) 因此,新数据框应如下所示: > new_df v1 v2 v3 1 1 bla blabla 2 2 bla blabla 6 6

我试图从数据帧中提取几行(不是一行接一行)。应删除的行范围位于另一个数据帧中

我尝试使用for循环提取行,但不幸的是,只删除了最后一个范围

这是我使用的代码行(在“for”循环中,而“I”是变量):

这是数据帧(erase_df),包括我要删除的行的范围(“开始”向量表示应删除第一个行范围,“停止”向量表示应删除该范围内的最后一行)

因此,新数据框应如下所示:

> new_df
   v1  v2     v3
1   1 bla blabla
2   2 bla blabla
6   6 bla blabla
7   7 bla blabla
8   8 bla blabla
11 11 bla blabla
15 15 bla blabla

我期望的输出看起来像我上面提到的(new_df),但实际上,只有erase_df的最后一个范围被删除了(start=12,stops=14)

如果您将
seq
函数映射到
erase_df
上,为每一行创建一个要删除的行序列,然后
取消将它们全部列在一个向量中,您可以将
main_df
子集为该向量的负数,以删除给定范围内的行

remove <- unlist(Map(seq, erase_df[[1]], erase_df[[2]]))

main_df[-remove,]
#    v1  v2     v3
# 1:  1 bla blabla
# 2:  2 bla blabla
# 3:  6 bla blabla
# 4:  7 bla blabla
# 5:  8 bla blabla
# 6: 11 bla blabla
# 7: 15 bla blabla
删除
> erase_df
  starts stops
1      3     5
2      9    10
3     12    14
> new_df
   v1  v2     v3
1   1 bla blabla
2   2 bla blabla
6   6 bla blabla
7   7 bla blabla
8   8 bla blabla
11 11 bla blabla
15 15 bla blabla
remove <- unlist(Map(seq, erase_df[[1]], erase_df[[2]]))

main_df[-remove,]
#    v1  v2     v3
# 1:  1 bla blabla
# 2:  2 bla blabla
# 3:  6 bla blabla
# 4:  7 bla blabla
# 5:  8 bla blabla
# 6: 11 bla blabla
# 7: 15 bla blabla
library(data.table)
setDT(main_df)
setDT(erase_df)

setkey(erase_df, starts, stops)
main_df[, v0 := v1]
for_anti <- 
  foverlaps(main_df, erase_df, by.x = c('v0', 'v1'), type = 'within',
            nomatch = NULL)

main_df[!for_anti, on = .(v1)]
#    v1  v2     v3 v0
# 1:  1 bla blabla  1
# 2:  2 bla blabla  2
# 3:  6 bla blabla  6
# 4:  7 bla blabla  7
# 5:  8 bla blabla  8
# 6: 11 bla blabla 11
# 7: 15 bla blabla 15