2014-04-04 35 views
2

假設我有一個看起來像這樣的數據幀(DF):通過R中的組聲明應用?

Patient VisitDate Test 
    1  1mth  A 
    1  2mth  A 
    1  3mth  A 
    1  4mth  A 
    2  1mth  B 
    2  2mth  B 
    2  3mth  B 
    2  4mth  B 
    3  1mth  A 
    3  2mth  A 
    3  3mth  B 
    3  4mth  A 

這裏是爲了使示例數據幀代碼:

df <- data.frame(Patient=c(1,1,1,1,2,2,2,2,3,3,3,3), 
     VisitDate=c("1mth","2mth","3mth","4mth","1mth","2mth","3mth","4mth","1mth","2mth","3mth","4mth"), 
       Test=c("A","A","A","A","B","B","B","B","A","A","B","A")) 

我想創建所有的列表有不同的測試和訪問日期的患者。如何進行此項檢查?

有沒有像「按組申請」功能這樣的事情?

所以結果這個例子是患者3在3mnth(因爲他把試驗B和其他測試,他拿了,其他時間點測試A)

+0

你只想要第一次當他們有了第二個類型的測試? – thelatemail

+2

是的,有一個「按組申請」的功能,它被合理地稱爲'by()'。在'?by'查看幫助頁面。您需要考慮一下您提供的功能(通過「FUN」參數) - 但您的問題並不完全清楚。例如,你爲什麼不要輸出「患者3在1月,2月,4月」?也許你想澄清一下。 –

+0

我想看看每個病人的測試是否有變化。我想要任何異常值。 – Sheila

回答

2

一些不同的選擇:

ave

df[as.logical(ave(as.character(df$Test),df$Patient,FUN=function(x) x != x[1])),] 

# Patient VisitDate Test 
#11  3  3mth B 

by

do.call(rbind, by(df, df$Patient, function(x) x[x$Test != x$Test[1],])) 
# Patient VisitDate Test 
#3  3  3mth B 

data.tableby

library(data.table) 
df <- as.data.table(df) 
df[, .SD[Test != Test[1]], by=Patient] 

# Patient VisitDate Test 
#1:  3  3mth B