2015-08-14 95 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

是的,我们保留它们。这对我来说是最有趣的情况!它工作得很好 –

相关问题