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

时间:2018-01-17 16:56:40

标签: r

因此,如果我想在数据帧中删除最后几行,我会写

head(df, -n)

它适用于除0以外的所有n的文件。有人知道为什么吗?

head(df, -0)

将返回空数据帧。

0需要单独处理。 - (

2 个答案:

答案 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行

首先,一个简单的解决方法是,即使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