在R中结合头和尾方法

在R中结合头和尾方法,r,dataframe,tail,head,cat,R,Dataframe,Tail,Head,Cat,我在R包utils中经常使用head(d)和tail(d)方法——经常一个接一个地使用。因此,我为这两个函数编写了一个简单的包装器: ht为什么不修改函数以输出列表 ht <- function(d, m=5, n=m){ # print the head and tail together list(HEAD = head(d,m), TAIL = tail(d,n)) } 有人建议我把我的评论变成回答 在R控制台中,键入head(m,5)时,屏幕上打印的内容实际上是print

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


ht为什么不修改函数以输出列表

ht <- function(d, m=5, n=m){
  # print the head and tail together
  list(HEAD = head(d,m), TAIL = tail(d,n))
}

有人建议我把我的评论变成回答


在R控制台中,键入
head(m,5)
时,屏幕上打印的内容实际上是
print(head(m,5))
的结果。因此,如果这是您希望输出的样子,在显示对象<<代码>头< <代码>和<代码>尾部>代码>时,请考虑使用<代码>打印< /代码>函数,而不是<代码> CAT<代码> >:

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
ht
#       [,1]
# [16,]    6
# [17,]    7
# [18,]    8
# [19,]    9
# [20,]   10

我发现@mrdwab的答案是一个非常优雅的解决方案。它不显式使用
打印
,而是返回一个列表。但是,当从R控制台调用他的函数且输出未分配给任何对象时,它将被打印到控制台(因此隐式使用
print
)。我希望这有助于您理解正在发生的事情。

如果您已经在使用
tidyverse
原则进行编码,并使用
%%>%
(管道)操作符,那么实际上很容易只使用一行代码:

library(magrittr)

your_dataframe %>% {
rbind(head(., 8), tail(., 8)
} %>% 
nrow()

# [1] 16

这基本上是使用
rbind
来合并
数据帧的顶部
head()
和底部
tail()
{}
用于调用lambda表达式(更多信息)。
头部
尾部
内的
表示“标准输入”(
您的_数据框

在R控制台中,当您键入
head(m,5)
时,它将显示与打印(head(m,5))相同的结果。因此,考虑使用<代码>打印>代码>而不是<代码> CAT<代码>,如果这就是你想要的结果是什么样子的。Fordel'就是答案。将输出注释的cat函数与打印函数混合以显示对象@弗洛德尔,把这当作一个答案。没有理由不这样做——我只是没有意识到这是必要的。在ncols为1的情况下,您认为最好取消分类并将其视为向量吗?还是最好保持列表形式?@ricardo,你打算对输出做什么?是否以交互方式使用它只是为了获取有关数据的一些信息?您正在保存输出吗?不过,一般来说,我会说,如果你想准确地表示你的数据,就把它保存在列表中。我只是计划在终端上使用它-我只想使用cat,因为它会返回空值。。。所以,如果我“忘记”了,我就不会在分配上遇到麻烦。mrdwab,经过一些实验,我决定返回值不是世界上最糟糕的事情。。。这很可能是有用的。我已经修改了您的代码,使输出与输入相关联,这样,如果您“忘记”,就可以看到发生了什么。我想这解决了我的担忧。因此,它现在是:函数(d,m=5,n=m){#将head和tail一起打印列表+1。@mrdwab:我采用了你的解决方案-我将其抄写为一篇博客文章。我链接到了这个答案-仅供参考。谢谢,这很有帮助。我注意到utils中head和tail有ftable、table和function的方法-这种方法也能处理所有这些情况吗?(我是afk,所以现在无法查看-但想发表评论,感谢您的解释)。是的,任何既有
head
方法又有
tail
方法的东西。
m <- matrix(1:10, 20)
ht(m)
head(m, 5)
tail(m,5)
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'
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)
ht <- function(d, m=5, n=m){
  # print the head and tail together
  list(HEAD = head(d,m), TAIL = tail(d,n))
}
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
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
library(magrittr)

your_dataframe %>% {
rbind(head(., 8), tail(., 8)
} %>% 
nrow()

# [1] 16