2017-03-21 6 views
1

大きなデータセットがあります。 すべての不正な行を削除します。また、私は間違った行の前後にいくつかの行を削除したい。不適切な行をフィルタリング/削除する(プラスおよびそれ以下)

私は何か役に立つと感じました。しかし、残念ながらそれは私のためにうまくいかない。 私は "rownames"と関係があると思いますが、私はそれを修正することができません。 ご迷惑をおかけして申し訳ございません。

library(dplyr) 

var1 <- 1:20 
var2 <- c(1,1,1,1,0,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1) 
var3 <- rep(3, 20) 

dat <- data.frame (var1, var2, var3) 
View(dat) 


extract.with.context <- function(x, rows, after = 0, before = 0) { 

    match.idx <- which(rownames(x) %in% rows) 
    span  <- seq(from = -before, to = after) 
    extend.idx <- c(outer(match.idx, span, `+`)) 
    extend.idx <- Filter(function(i) i > 0 & i <= nrow(x), extend.idx) 
    extend.idx <- sort(unique(extend.idx)) 

    return(x[extend.idx, , drop = FALSE]) 
} 

extract.with.context(dat, dat$var2==0, after = 1, before = 1) 

View(dat) 

#expected output 
var1 <- c(1,2,3,9,14,15,16,20) 
var2 <- c(1,1,1,1,1,1,1,1) 
var3 <- rep(3,length(var2)) 
dat <- data.frame(var1, var2, var3) 
View(dat) 
+1

"不正な行が" 何ですか?また、予期した出力を追加してください。 – Sotos

+0

不正な行はそれらのものですvar2 == 0 – SDahm

+1

前/後が同じなら、あなたは 'dat [!zoo :: rollsum(dat $ var2 == 0、k = 3、fill = FALSE)> 0、] ' –

答えて

3

我々はcolumnvalueに等しく、インデックスindxindx + afterindx - beforeの行を削除した行のインデックスを取得します。

extract.with.context <- function(df, column, value, before, after) { 
    indx <- which(df[[column]] == value) 
    df[-c(indx, indx + after, indx - before), ] 
} 

extract.with.context(dat, "var2", 0, 1, 1) 

# var1 var2 var3 
#1  1 1 3 
#2  2 1 3 
#3  3 1 3 
#9  9 1 3 
#14 14 1 3 
#15 15 1 3 
#16 16 1 3 
#20 20 1 3 
+1

行/要素を位置でサブセット化するときは、実際に値が見つかったかどうかを確認することをお勧めします。例えば ​​'x < - 1:10; I <- which(x> 10); x [-i] 'となる。だから、私はいつも論理的なインデックスを好むが、後/前にはそれが難しいからだ。 –

+0

@docendodiscimusはい、かなり可能です。 'indx'が値を見つけたかどうかを確認するために' if'条件を追加できます。 –

0

いくつかのプロフェッショナルの助け:)

toDelete<- c(which(dat$var2==0) , which(dat$var2==0)+1, which(dat$var2==0)-1) 
dat <- dat[-toDelete,] 

またはより良いが、(何も削除されていない場合のために制御する)だ

toDelete<- c(which(dat$var2==0) , which(dat$var2==0)+1, which(dat$var2==0)-1) 
if (!identical(toDelete,numeric(0))) { dat <- dat[-toDelete,] } 
+2

'($ $ var2 == 0)'行を3回連続して実行することに気付きましたか?おそらくそれは、SOの人々は常に1行ですべてをやろうとしますが、私の見地からは非常に冗長であり、したがって不完全で非効率的なコーディングだからです。一度実行し、結果をオブジェクトに格納してから、必要に応じて呼び出す –

関連する問題