簡體   English   中英

如何刪除R中的重復項

[英]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 )的粉絲。 dfdf$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM