web-dev-qa-db-ja.com

Rデータフレームからの行の削除

次のデータフレームがあります。

> str(df)
'data.frame':   3149 obs. of  9 variables:
 $ mkod : int  5029 5035 5036 5042 5048 5050 5065 5071 5072 5075 ...
 $ mad  : Factor w/ 65 levels "Akgün Kasetçilik         ",..: 58 29 59 40 56 11 33 34 19 20 ...
 $ yad  : Factor w/ 44 levels "BAKUGAN","BARBIE",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ donem: int  201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
 $ sayi : int  201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
 $ plan : int  2 2 3 2 2 2 7 3 2 7 ...
 $ sevk : int  2 2 3 2 2 2 6 3 2 7 ...
 $ iade : int  0 0 3 1 2 2 6 2 2 3 ...
 $ satis: int  2 2 0 1 0 0 0 1 0 4 ...

このデータフレームから21の特定の行を削除します。

> a <- df[df$plan==0 & df$sevk==0,]
> nrow(a)
[1] 21

したがって、これらの21行を削除すると、3149-21 = 3128行の新しいデータフレームができます。私は次の解決策を見つけました:

> b <- df[df$plan!=0 | df$sevk!=0,]
> nrow(b)
[1] 3128

上記の私のソリューションでは、変更された論理式(!= の代わりに ==および| の代わりに &)。元の論理式を変更する以外に、21行のない新しいデータフレームを取得するにはどうすればよいですか?私はそのようなものが必要です:

> df[-a,] #does not work

[〜#〜] edit [〜#〜](特にダウンボーターの場合、代替ソリューションが必要な理由を彼らが理解していることを願っています):長いコードを書いているので、別のソリューションを求めました、そしてコードのさまざまな部分にさまざまな変数の割り当て(この例ではaのような)があります。そのため、コードの前の部分で行を削除する必要がある場合、戻ってaのような式の中に論理式の逆を記述したくありません。それが理由です df[-a,]の方が使いやすいです。

22

rownamesを使用して、「補足」データフレームを指定できます。それらが数値の行名であれば簡単です:

df[-as.numeric(rownames(a)),]

しかし、より一般的には以下を使用できます:

df[setdiff(rownames(df),rownames(a)),]
12
James

論理的な添え字を否定するだけです:

a <- df[!(df$plan==0 & df$sevk==0),]
15
Joshua Ulrich

subset()をお探しですか?

dat <- airquality
dat.sub <- subset(dat, Temp > 80 & Month < 10)

dim(dat)
dim(dat.sub)

あなたの例に適用:

df.sub <- subset(df, plan != 0 & sevk != 0)
9
jthetzel

あと少しです。 「a」はインデックスのベクトルである必要があります:

    df <- data.frame(plan=runif(10),sevk=runif(10))
    a <- c(df$plan<.1 | df$sevk < .1) # some logical thing
    df[-a,]

または、あなたのデータで:

    a <- c(df$plan==0 & df$sevk==0)
    df[-a,]
2
tim riffe

あなたがあなたの解決策に反対する理由はわかりませんが、ここに別の方法があります。

which( df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist 
newdf <- df[-c(killlist[1,])] 
0
Carl Witthoft