[英]How to remove duplicates in R
我有一個非常大的數據集,它看起來如下所示: 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),]
使用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
來完成此操作。
對於這種事情,我是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.