因此,如果我想在数据帧中删除最后几行,我会写
head(df, -n)
它适用于除0以外的所有n的文件。有人知道为什么吗?
head(df, -0)
将返回空数据帧。
0需要单独处理。 - (
答案 0 :(得分:2)
head
只是[
的便利功能:
getAnywhere(head.data.frame)
#function (x, n = 6L, ...)
#{
# stopifnot(length(n) == 1L)
# n <- if (n < 0L)
# max(nrow(x) + n, 0L)
# else min(n, nrow(x))
# x[seq_len(n), , drop = FALSE]
#}
正如您所看到的,n
最终会对data.frame进行子集化。零或负零将返回R中data.frame的结构。这就是它的预期。
但是,编写自己的head
函数非常容易:
head2 <- function(df, n) {
#or do anything else
if (n == 0L | n == -0L) return(df)
head(df, n)
}
head2(iris, -5) #works as normal
head2(iris, -0) #returns whole df
答案 1 :(得分:1)
正如评论中已经指出的那样,因为-0等于0而head(df, 0)
表示返回零行。在下面签名的零部分中,我们将进一步探讨这一点
首先,一个简单的解决方法是,即使n等于零,也会删除最后n行:
head(df, nrow(df) - n)
另一方面,在浮点(但不是整数运算)中实际上存在有符号零的东西。考虑这个版本的head,如果n = -0则删除0行,如果n是+0,则返回0行:
is_minus_zero <- function(x) identical(x, 0) && sign(1/x) == -1
head2 <- function(x, n) {
if (is_minus_zero(n)) df
else head(x, n)
}
head2(BOD, 0)
## [1] Time demand
## <0 rows> (or 0-length row.names)
head2(BOD, -0)
## Time demand
## 1 1 8.3
## 2 2 10.3
## 3 3 19.0
## 4 4 16.0
## 5 5 15.6
## 6 7 19.8