2014-12-10 2 views
0

У меня есть набор данных, который показывает идентификатор визита и имя субъектаФорматирование вывода в R

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 

Мне интересно, есть ли способ, что я могу изменить выход таким образом, чтобы она стала s:

A 3 
B 2 
C 1 
D 3 
E 3 

Спасибо

ответ

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 
+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] 
+0

большое вам спасибо! Это очень полезно –

1

Он может чувствовать себя грязной, но используя базовую функцию as.matrix (или matrix по этому вопросу) даст вам то, что вам нужно.

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

Вы можете легко сделать это в базе R с stack:

stack(tapply(visit, subject, max)) 
# values ind 
# 1  3 A 
# 2  2 B 
# 3  1 C 
# 4  3 D 
# 5  3 E 

(Примечание: В этом случае значения для «посещения» и «субъект» не на самом деле исходящее от data.frame . Просто думал, что вы должны знать)


(второе примечание: вы можете также сделать data.frame(as.table(tapply(visit, subject, max))), но это более обманчивым, чем при использовании stack так может привести к лю ss читаемый код позже.)