2011-05-27 67 views
1

我有一个脚本,有一堆质量控制校验和,它捕捉到一个数据集,因为质量控制,不需要删除任何样本(行)。然而,这个脚本给了我一个零行数据框的意外结果。带有示例数据,为什么这项工作:从数据帧中删除零线产生零线的数据帧

data(iris) 
##get rid of those pesky factors 
iris$Species <- NULL 
med <- which(iris[, 1] < 4.9) 
medtemp <- iris[-med, ] 
dim(medtemp) 
[1] 134 4 

但这返回零行的数据帧:

small <- which(iris[, 1] < 4.0) 
smalltemp <- iris[-small, ] 
dim(smalltemp) 
[1] 0 4 

至于做这个的:

x <- 0 
zerotemp <- iris[-x, ] 
dim(zerotemp) 
[1] 0 4 

看来,smalltemp数据帧应与iris的尺寸相同,因为根本没有要移除的行。为什么是这样?

回答

3

从Patrick Burns的p逐字复印。 41(我希望这构成了“合理使用” - 如果有人反对,我会删除它)

负什么东西

> x2 <- 1:4 
> x2[-which(x2 == 3)] 
[1] 1 2 4 

以上返回命令的所有值的x2不等于至3

> x2[-which(x2 == 5)] 
numeric(0) 

希望是,上述命令将返回所有的x2因为没有元件 等于5现实将冲这种希望。相反,它返回一个长度为 零的向量。 有以下两个语句之间的细微差别:在输入

x[] 
x[numeric(0)] 

微妙的差异,但在输出端上的差没有微妙。 原始问题至少有三种可能的解决方案。

out <- which(x2 == 5) 
if(length(out)) x2[-out] else x2 

另一种解决方案是使用逻辑标:

x2[!(x2 %in% 5)] 

或者你也可以,在一定意义上,向后工作:

x2[ setdiff(seq along(x2), which(x2 == 5)) ] 
+0

总是很好看将R地狱引用讨论这个答案意味着它可能会再次进行审查的好时机。 – Stedy 2011-05-27 21:20:35

2

而不是使用which得到您的指数,我会使用一个布尔向量并否定它。这样,你可以这样做:

small <- iris[, 1] < 4.0 
smalltemp <- iris[!small, ] 
dim(smalltemp) 
[1] 150 4 

编辑:我不认为0负指数(如你的情况)被允许,因为没有零指数,从而R可以不排除从指数您的选择。负面索引可以解释为:“给我所有的行,除了那些具有这些索引的行”。

2

难道在你的第二个例子,small评估为0?

以向量的零元素将始终返回空载体:

> foo <- 1:3 
> foo 
[1] 1 2 3 
> foo[0] 
integer(0) 
> 
2

这是因为对如何处理是零索引做的规则。只允许严格正面或严格负面的指数。作为[0]回报什么,

R> -0 == 0 
[1] TRUE 

所以你什么也得不到,你期望它下降什么。

identical(0)问题被视为由NULL建立索引,并将其记录为按索引编制0,因此具有相同的行为。

这在R Language Definition manual