我有一组数据显示访问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
谢谢
答案 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
:
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
更具欺骗性,因此可能导致以后的代码不太可读。)