格式化R中的输出

时间:2014-12-10 12:06:26

标签: r format output

我有一组数据显示访问ID和主题名称

visit<-c(1,2,3,1,2,1,1,2,3,1,2,3)
subject<-c("A","A","A","B","B","C","D","D","D","E","E","E")
data<-data.frame(visit=visit,subject=subject)

我试图找出每个主题的最新访问ID:

tapply(visit,subject,max)

我得到了这个输出:

A B C D E
3 2 1 3 3

我想知道是否有任何方法可以更改输出,使其变为:

A  3
B  2
C  1
D  3
E  3

谢谢

4 个答案:

答案 0 :(得分:3)

您可以尝试aggregate

aggregate(visit~subject, data, max)
#   subject visit
#1       A     3
#2       B     2
#3       C     1
#4       D     3
#5       E     3

或来自tapply

res <- tapply(visit,subject,max)
data.frame(subject=names(res), visit=res)

data.table

library(data.table)
setDT(data)[, list(visit=max(visit)), by=subject]

答案 1 :(得分:2)

dplyr解决方案是:

library(dyplr)  
data %>% group_by(subject) %>% summarize(max = max(visit))
## Source: local data frame [5 x 2]

##   subject max
## 1       A   3
## 2       B   2
## 3       C   1
## 4       D   3
## 5       E   3

答案 2 :(得分:1)

可能会觉得很脏,但使用基本功能as.matrix(或matrix就可以了)会为您提供所需的信息。

> as.matrix(tapply(visit,subject,max))
  [,1]
A    3
B    2
C    1
D    3
E    3

答案 3 :(得分:1)

您可以使用stack

轻松地在基础R中执行此操作
stack(tapply(visit, subject, max))
#   values ind
# 1      3   A
# 2      2   B
# 3      1   C
# 4      3   D
# 5      3   E

(注意:在这种情况下,&#34;访问&#34;以及&#34;主题&#34;的值实际上并非来自您的data.frame。只是认为您应该知道!)


(第二个注释:你也可以data.frame(as.table(tapply(visit, subject, max)))但这比使用stack更具欺骗性,因此可能导致以后的代码不太可读。)