在R中结合头部和尾部方法
Posted
技术标签:
【中文标题】在R中结合头部和尾部方法【英文标题】:combining head and tail methods in R 【发布时间】:2012-07-20 23:20:02 【问题描述】:我经常使用 R 包 utils 中的 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 控制台中,当您键入head(m, 5)
时,它会显示与 print(head(m, 5))
相同的结果。因此,如果您希望结果看起来像这样,请考虑使用 print
而不是 cat
。
flodel's 就是答案。将输出注释的 cat 函数与打印函数混合以显示对象。 @flodel,把它作为答案。
【参考方案1】:
如果您已经在使用tidyverse
原则进行编码并使用%>%
(管道)运算符,那么实际上很容易只使用一条线:
library(magrittr)
your_dataframe %>%
rbind(head(., 8), tail(., 8)
%>%
nrow()
# [1] 16
这基本上使用rbind
来合并your_dataframe
的顶部head()
和底部tail()
。 用于调用 lambda 表达式(更多信息 here)。
head
和 tail
中的 .
表示“标准输入”(your_dataframe
)。
【讨论】:
【参考方案2】:有人建议我把我的评论变成答案。
在您的 R 控制台中,当您键入 head(m, 5)
时,您看到的打印在屏幕上的内容实际上是 print(head(m, 5))
的结果。因此,如果这是您希望输出的样子,请考虑在显示对象的 head
和 tail
时使用 print
函数而不是 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
我发现@mrdwab 的答案是一个非常优雅的解决方案。它没有显式使用print
,而是返回一个列表。但是,当从 R 控制台调用他的函数并且输出未分配给任何内容时,它会打印到控制台(因此隐式使用 print
)。我希望这可以帮助您了解发生了什么。
【讨论】:
谢谢,这很有帮助。我注意到 utils 中的 head 和 tail 具有 ftable、table 和 function 的方法——这种方法也能处理所有这些情况吗? (我是 afk,所以现在不能检查 - 但想发表评论说谢谢你的解释)。 是的,任何同时存在head
和tail
方法的东西。【参考方案3】:
为什么不修改你的函数来输出一个列表呢?
ht <- function(d, m=5, n=m)
# print the head and tail together
list(HEAD = head(d,m), TAIL = tail(d,n))
这是您的 matrix
和 data.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
【讨论】:
没有理由不这样做——我只是没有意识到这是必要的。在 ncols 为 1 的情况下,您认为最好取消分类并将其视为向量吗?还是最好保留列表形式? @ricardo,你打算对输出做什么?它是否以交互方式用于获取有关您的数据的一些信息?你在保存输出吗?不过,一般来说,我会说,如果您想要准确地表示您的数据,只需将其保留在列表形式中即可。 我只是计划在终端上使用它——我只热衷于使用 cat,因为它会返回一个 NULL ......所以如果我忘记了,我不会遇到分配问题'。 mrdwab,经过一些实验,我认为返回值并不是世界上最糟糕的事情......它很可能很有用。我已经修改了您的代码,以便输出与输入相关,因此如果您“忘记”,可以看到发生了什么。我认为这解决了我的担忧。因此,现在是: function(d, m=5, n=m) # 打印头尾一起 list +1。 @mrdwab:我选择了您的解决方案 - 我已经将它用于博客文章 here。我链接回这个答案 - 仅供参考。以上是关于在R中结合头部和尾部方法的主要内容,如果未能解决你的问题,请参考以下文章
R语言head函数和tail函数获取dataframe列表list向量vector的头部和尾部数据:tail提取数据对象的尾部数据head提取数据对象的头部数据默认6条数据自定义设置返回条数
R语言dplyr包为dataframe添加数据列实战( Add Columns):基于mutate()函数添加一个或者多个数据列(尾部添加头部添加条件生成某个具体数据列的前后)