我无法弄清楚删除具有特定值的数据帧的行以及它们下面的下两行的语法。有人可以帮忙吗?
干杯
答案 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