2012-08-14 39 views
4

我有一個非常大的數據集,它看起來像下面這樣: df <- data.frame(school=c("a", "a", "a", "b","b","c","c","c"), year=c(3,3,1,4,2,4,3,1), GPA=c(4,4,4,3,3,3,2,2))刪除重複任何幫助將是巨大的

school year GPA 
    a 3 4 
    a 3 4 
    a 1 4 
    b 4 3 
    b 2 3 
    c 4 3 
    c 3 2 
    c 1 2 

,我希望它看起來像:

school year GPA 
a 3 4 
a 3 4 
b 4 3 
c 4 3 

所以基本上,我想要的是每個給定的學校,我希望他們的高年級學生(學生),不管GPA。

我曾嘗試:

new_df <- df[!duplicated(paste(df[,1],df[,2])),] 但是這給了我的學校和年之間的獨特組合。

,而下面的人給我的唯一學校 new_df2 <- df[!duplicated(df$school),]

任何幫助將是巨大的,謝謝大家!

回答

6

使用plyr

require(plyr) 
ddply(df,.(school),function(x){x[x$year==max(x$year),]}) 
> ddply(df,.(school),function(x){x[x$year==max(x$year),]}) 
    school year GPA 
1  a 3 4 
2  a 3 4 
3  b 4 3 
4  c 4 3 

或基地

test<-lapply(split(df,df$school),function(x){x[x$year==max(x$year),]}) 
out<-do.call(rbind,test) 
> out 
    school year GPA 
a.1  a 3 4 
a.2  a 3 4 
b  b 4 3 
c  c 4 3 

說明: split拆分數據幀到學校名單。

dat<-split(df,df$school) 

> dat 
$a 
    school year GPA 
1  a 3 4 
2  a 3 4 
3  a 1 4 

$b 
    school year GPA 
4  b 4 3 
5  b 2 3 

$c 
    school year GPA 
6  c 4 3 
7  c 3 2 
8  c 1 2 

對於每個學校我們都希望成員在最佳年份。

dum.fun<-function(x){x[x$year==max(x$year),]} 

> dum.fun(dat$a) 
    school year GPA 
1  a 3 4 
2  a 3 4 

lapply在一個列表的成員適用的功能和輸出列表

> lapply(split(df,df$school),function(x){x[x$year==max(x$year),]}) 
$a 
    school year GPA 
1  a 3 4 
2  a 3 4 

$b 
    school year GPA 
4  b 4 3 

$c 
    school year GPA 
6  c 4 3 

這就是我們想要的,但以列表形式。我們需要將列表的成員綁定在一起。我們通過先後使用do.call的會員電話號碼rbind來做到這一點。

+0

謝謝你這麼多ttmaccer,我解決了我的問題! :P – user1489597 2012-08-14 03:15:28

5

我是by聲明(請參閱?by)這種事情的粉絲。 df根據df$school分成組,然後返回代表max(year)的每個學校的行。

> by(df,df$school,function(x) x[x$year==max(x$year),]) 
df$school: a 
    school year GPA 
1  a 3 4 
2  a 3 4 
------------------------------------------------------------ 
df$school: b 
    school year GPA 
4  b 4 3 
------------------------------------------------------------ 
df$school: c 
    school year GPA 
6  c 4 3 

do.call(rbind...只是加入了針對從by語句返回每個學校的結果。

do.call(rbind,by(df,df$school,function(x) x[x$year==max(x$year),])) 

    school year GPA 
a.1  a 3 4 
a.2  a 3 4 
b  b 4 3 
c  c 4 3 
+0

@ttmaccer - 考慮它是多麼有用,它似乎是一個未被充分利用的R函數。當我第一次遇到這個陷阱時,我陷入了一個新手的境地,它並沒有意識到它的輸出只是一個普通的「列表」。 – thelatemail 2012-08-14 02:39:37

+0

感謝您的意見。 theletemail – user1489597 2012-08-14 03:16:43