2015-08-14 137 views
5

我想從我的數據框中刪除一些行。我認爲使用subset這將是最簡單的方法。如何根據子集函數從數據框中刪除行?

我用下面的代碼之前刪除一些行:

data_selected <- subset(tbl_data, Name.x != "XXX" & Name.y != "YYY") 

的問題是如何從我的表,該表有兩個單元相同的字符串(同一行)的行。

我認爲mtcars可以用來作爲一個例子:

     mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
Hornet 4 Drive  21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 

gearcarb列都可以使用。正如你所看到的,應該從這個數據中刪除兩個第一行,因爲在這兩列中都有相同的值4。請記住我的數據中我沒有數字值,但字符串。

+1

豈不'子集(mtcars,齒輪! =碳水化合物)'工作 – akrun

+1

@akrun的答案是你想要的。處理非數字值時要小心,因爲您可能在比較因子列時遇到問題。嘗試在dt = data.frame(x = c(「A」,「B」,「C」)處使用:subset(dt,x!= y), y = c(「A」,「A」 「B」))然後在dt = data.frame(x = c(「A」,「B」,「C」),y = c(「A」,「A」,「B」),stringsAsFactors = F) – AntoniosK

回答

3

基於在崗的信息,我認爲「檔」和「碳水化合物」列之間的比較(!=)將足以subset數據集

df1 <- mtcars[1:5,] 
subset(df1, gear!=carb) 
#      mpg cyl disp hp drat wt qsec vs am gear carb 
#Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 

這也應該爲「非工作 - 數字'列,但不適用於部分匹配。

如果我們需要關於保持有兩個「未知」,我們可以添加另一個邏輯狀態(`(齒輪==「未知」 &碳水化合物==「未知」)後使用|操作行異常)到原始狀態。

使數據集中的一些變化,顯示輸出(只是作爲一個例子,我知道我做這個不斷變化的數字列字符)

df1$gear[4] <- 'Unknown' 
df1$carb[4] <- 'Unknown' 
df1$gear[5] <- 'Unknown' 


subset(df1, (gear=='Unknown' & carb=='Unknown') | gear!=carb) 
#     mpg cyl disp hp drat wt qsec vs am gear carb 
#Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1  4  1 
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 Unknown Unknown 
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 Unknown  2 
+0

這太容易了!謝謝。我可以問另外的問題嗎?有可能在那裏發生異常嗎?例如,如果兩列都有一個字符串「未知」,請保留它們。 –

+1

@ShaxiLiver我有一個疑問,假設如果其中一列有'未知'的行,而另一列是不同的。但是,根據我們的第一個條件'gear!= carb',我們應該保留它們,對嗎? – akrun

+0

是的,我們保留它們。這對我來說是最有趣的情況!它工作得很好 –

相關問題