如何在R中去除重复项

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),]
2个回答

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

我们需要以列表形式呈现这个内容。我们需要将列表的成员绑定在一起。通过连续调用rbind,使用do.call实现。


5

我是这种情况下 by 语句的忠实拥护者(参见 ?by)。根据学校 df$schooldf 分成组,并返回代表 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

@ttmaccer - 看起来这个 R 函数并没有得到充分利用,考虑到它的实用性。当我第一次接触它时,作为一个新手,我掉进了陷阱,没有意识到它的输出只是一个普通的 list - thelatemail
谢谢您的回复。theletemail - user1489597

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接