以编程方式从数据框中删除行;令人困惑的行为

时间:2015-12-16 15:18:23

标签: r

我最近遇到困扰我的R行为。我希望有人可以帮助我理解为什么会发生以下情况。

如果我有一个数据框,并且我想以编程方式从该数据帧中删除行,我可以使用以下示例代码:

x <- data.frame(id = seq(1, 10, 1), 
                num = sample(1:10, 10, TRUE))
y <- data.frame(id = c(2, 4, 6))

which(x$id %in% y$id)
x <- x[-which(x$id %in% y$id), ]

这完全符合我的期望:

> x
   id num
1   1   3
3   3   5
5   5   6
7   7   1
8   8   7
9   9   3
10 10   4

如果我将上述代码中的y更改为x$id的数字,

x <- data.frame(id = seq(1, 10, 1), 
                num = sample(1:10, 10, TRUE))

y <- data.frame(id = c(11))

which(x$id %in% y$id)
x <- x[-which(x$id %in% y$id), ]

我原本希望从x中删除没有行,而是x为空:

> x
[1] id  num
<0 rows> (or 0-length row.names)

有人可以解释为什么会这样吗?我希望得到原始的x数据框,因为x$id中没有y$id的值。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您没有匹配,则which()的结果是空向量,因此您要求没有行=空数据框。请注意,在这种情况下否定无效,因为没有任何可否定的内容。

非常清楚,子集中的-符号没有特殊含义,它只是否定了您传递的整数。如果你没有通过任何东西,就没有什么可以否定的。