-3

特定の値のデータフレームの行と、その下の次の2行を削除する構文がわかりません。誰でも助けることができますか?

乾杯

4

2 に答える 2

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
于 2013-03-12T08:32:28.773 に答える
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
于 2013-03-12T10:40:52.657 に答える