从数据框中删除某些行加上接下来的两行

时间:2013-03-12 08:25:45

标签: r

我无法弄清楚删除具有特定值的数据帧的行以及它们下面的下两行的语法。有人可以帮忙吗?

干杯

2 个答案:

答案 0 :(得分:2)

这是一种(不是很优雅)的方式:

# Sample data
df <- data.frame(x=c(1:5,1:5),y=rnorm(10))
# Computing selection
select <- rep(TRUE, nrow(df))
index <- which(df$x==3)
select[unique(c(index,index+1,index+2))] <- FALSE
# Rows selection
df[select,]

给出了:

  x          y
1 1 -0.2438523
2 2 -0.8004811
6 1  0.5970947
7 2  1.8124529

答案 1 :(得分:1)

另一种方式。您可以创建一个小的实用程序函数,循环移动矢量和OR,它们的数量是您想要从匹配位置移除的值的数量。

cyclic_or_shift <- function(x, times) {
    for (i in 1:times)
        x <- x | c(FALSE, head(x, -1))
    x   
}

set.seed(45)
df <- data.frame(x=c(10,20,3,40,50,3,60,70,80), y=rnorm(9))
df[!(cyclic_or_shift(df$x == 3, 2)),]

#    x          y
# 1 10  0.3407997
# 2 20 -0.7033403
# 9 80  1.8090374

优点:您可以使用它删除任意数量的连续行:

set.seed(45)
df <- data.frame(x=c(1,2,3,4,5,6,7,3,8,9,10,3,11,12,13,3))
df$y <- rnorm(nrow(df))
# > df
#     x          y
# 1   1  0.3407997
# 2   2 -0.7033403
# 3   3 -0.3795377
# 4   4 -0.7460474
# 5   5 -0.8981073
# 6   6 -0.3347941
# 7   7 -0.5013782
# 8   3 -0.1745357
# 9   8  1.8090374
# 10  9 -0.2301050
# 11 10 -1.1304182
# 12  3  0.2159889
# 13 11  1.2322373
# 14 12  1.6093587
# 15 13  0.4015506
# 16  3 -0.2729840

# remove the next 3 elements as well from every matching index
df[!(cyclic_or_shift(df$x == 3, 3)),]
#   x          y
# 1 1  0.3407997
# 2 2 -0.7033403
# 7 7 -0.5013782