2011-10-27 129 views
21

卸下行我有以下的數據幀:從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 

編輯(尤其是downvoters,我希望他們明白,爲什麼我需要一個替代的解決方案):我問了不同的解決方案,因爲我正在寫一個長碼,和在我的代碼的各個部分中有各種變量賦值(如我的示例中的a)。所以,當我需要在代碼的前進部分中刪除行時,我不想回去嘗試在類似於a的表達式中編寫邏輯表達式的反轉。這就是爲什麼df[-a,]對我更有用。

+0

-1你必須包含在問題中的解決方案。沒有問題需要解決(因爲目前的問題措辭)。 –

+1

@RichieCotton:我的解決方案使用了一個修改過的(不同的)邏輯表達式,最終得到我需要的結果;但我想看到的是如何從數據框中刪除特定的行。我在我的問題中包含了我的解決方案,因爲我不想在答案中看到它。 –

+0

我已經在我的問題中添加了幾行以解釋我想知道的內容。 –

回答

12

可以使用rownames指定一個「互補」數據幀。它如果他們更容易數值rownames:

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

但更通常可以使用:

df[setdiff(rownames(df),rownames(a)),] 
+0

當然這裏假定你有rownames,OP在這種情況下做的,但它不是一個通用的解決方案 –

+5

'rownames(df)< - 1:nrow(df)' – James

2

你快到了。 「一個」必須是索引的矢量:

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,] 
+0

我試着用我的數據代碼的最後兩行,但它給出了錯誤的結果(3148行而不是3128)。 (順便說一下,'b [-a,]'應該是'df [-a,]'我猜) –

+0

對於slop的抱歉 - 它與我上面的自包含的小示例一起工作,所以我想無論您的情況如何數據已經超過我的腦袋 –

0

我不明白爲什麼你反對你的解決方案,但這裏的另一種方式。

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

您是在查找subset()

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

dim(dat) 
dim(dat.sub) 

適用於你的例子:

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

這與我的解決方案:'df [df $ plan!= 0 | df $ sevk!= 0,]'選擇一個子集;但無論如何感謝。 –

+0

順便說一句,'&'運算符必須是'subset(df,plan!= 0&sevk!= 0)'中的'|'(OR)運算符。 –

+0

這是一個非常好的解決方案! – Brian

14

就否定了你的邏輯下標:

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