在R中删除数据帧中的最后n行(删除零行)

在R中删除数据帧中的最后n行(删除零行),r,R,所以,如果我想在dataframe中删除最后n行,我会写 head(df, -n) 它适用于除0以外的所有n。有人知道为什么吗 head(df, -0) 将返回空数据帧 0需要单独处理-(head只是[的一个方便功能: getAnywhere(head.data.frame) #function (x, n = 6L, ...) #{ # stopifnot(length(n) == 1L) # n <- if (n < 0L) # max(nrow

所以,如果我想在dataframe中删除最后n行,我会写

head(df, -n)
它适用于除0以外的所有n。有人知道为什么吗

head(df, -0)
将返回空数据帧


0需要单独处理-(

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]
#}

正如注释中已经指出的,这是因为-0等于0,并且
head(df,0)
表示返回零行。在下面的带符号零部分中,我们将进一步探讨这一点

即使n为零,也删除n行 首先,下面是一个简单的解决方法,即使n等于零,也会删除最后n行:

head(df, nrow(df) - n)
符号零

另一方面,在浮点(但不是整数运算)中,实际上有符号零的情况。考虑这个版本的头,如果n=0,则删除0行,如果n为+0:/p>,则返回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

is\u减\u零子集使用零返回data.frame的结构。这就是它的意图。请尝试
iris[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