在R中结合头和尾方法
我在R包utils中经常使用head(d)和tail(d)方法——经常一个接一个地使用。因此,我为这两个函数编写了一个简单的包装器:在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
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