R中的组合头尾方法

问题描述 投票:4回答:3

我在R包实用程序中经常使用head(d)和tail(d)方法-经常一个接一个地使用。因此,我为这两个函数编写了一个简单的包装器:

    ht <- function(d, m=5, n=m){
      # print the head and tail together
      cat(" head -->  ", head(d,m), "\n", "--------", "\n", "tail -->  ", tail(d,n), "\n")
    }

而且我得到了一些意想不到的结果。有人可以帮我理解为什么吗? (这样我就可以解决它,或者至少了解您的解决方案!)。

某些背景...

数值很好用:

x <- 1:100
ht(x)

复杂度也是如此:

ni <- as.complex(1:100)
ht(ni)

和字符:

ll <- letters[1:26]
ht(ll)

[矩阵丢失了它的结构,将[1,1]返回到[5,5] + [16,1]返回到[20,5],但作为两个向量-比较:

m <- matrix(1:10, 20)
ht(m)

至:

head(m, 5)
tail(m,5)

我想保留矩阵结构,就像utils方法一样-这可能吗?

最后(嗯,可能还有更多的错误,这正是我要做的事情。)data.frames是一团糟:

df <- data.frame(num=x[1:26], char=ll)
ht(df)

这将产生以下错误:

head -->   Error in cat(list(...), file, sep, fill, labels, append) :   
  argument 2 (type 'list') cannot be handled by 'cat'

到目前为止的步骤:

由于utils方法以位为单位时保持矩阵整洁,因此我尝试通过以下编辑来解决此问题:

function(d, m=5, n=m){
  # print the head and tail together
  rb <- rbind(head(d, m), tail(d,n))
  if (class(d) == 'matrix'){
    len <- nrow(rb)
    cat(" head -->  ", rb[(1:m),], "\n", "--------", "\n", "tail -->  ", rb[((len-n):len),], "\n")
  }
  else cat(" head -->  ", rb[1,], "\n", "--------", "\n", "tail -->  ", rb[2,], "\n")
}

似乎没有对矩阵做任何事情,但在使用时仍会因相同的错误而中断:

ht(df)

我从错误中猜测cat()此处存在一些问题,但我无法弄清楚它是什么或如何修复。

有人可以帮忙吗?

r dataframe tail head cat
3个回答
7
投票
ht <- function(d, m=5, n=m){ # print the head and tail together list(HEAD = head(d,m), TAIL = tail(d,n)) }

这是您的matrixdata.frame的输出:

ht(matrix(1:10, 20))
# $HEAD
#      [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4
# [5,]    5
# 
# $TAIL
#       [,1]
# [16,]    6
# [17,]    7
# [18,]    8
# [19,]    9
# [20,]   10

ht(data.frame(num=x[1:26], char=ll))
# $HEAD
#   num char
# 1   1    a
# 2   2    b
# 3   3    c
# 4   4    d
# 5   5    e
# 
# $TAIL
#    num char
# 22  22    v
# 23  23    w
# 24  24    x
# 25  25    y
# 26  26    z

5
投票
在R控制台中,键入head(m, 5)时,屏幕上显示的内容实际上是print(head(m, 5))的结果。因此,如果这是您希望输出的样子,请在显示对象的printcat时考虑使用head函数而不是tail

ht <- function(d, m=5, n=m) { # print the head and tail together cat("head -->\n") print(head(d,m)) cat("--------\n") cat("tail -->\n") print(tail(d,n)) } m <- matrix(1:10, 20) ht(m) # head --> # [,1] # [1,] 1 # [2,] 2 # [3,] 3 # [4,] 4 # [5,] 5 # -------- # tail --> # [,1] # [16,] 6 # [17,] 7 # [18,] 8 # [19,] 9 # [20,] 10

我发现@mrdwab的答案是一个非常优雅的解决方案。它没有显式使用print,而是返回一个列表。但是,当从R控制台调用他的函数并且未将输出分配给任何内容时,该输出将打印到控制台(因此隐式使用print)。我希望这可以帮助您了解发生了什么。


0
投票
library(magrittr) your_dataframe %>% { rbind(head(., 8), tail(., 8) } %>% nrow() # [1] 16

基本上使用rbind合并head()的顶部tail()和底部your_dataframe{}用于调用lambda表达式(更多信息here)。 .head内部的tail表示“标准输入”(your_dataframe)。

© www.soinside.com 2019 - 2024. All rights reserved.