删除行w。重复信息,同时保留第一个非重复条目(并使用重复条目的数据附加该行)

时间:2015-06-26 07:03:54

标签: r dataframe duplicate-removal

我有一个包含500k条目(行)的数据集。每个条目都是针对特定学生的,并包含学生所在学校的信息 去了那个特定的学期。

因为学生在同一所学校住了几个学期,所以我为同一个学生和同一所学校准备了很多参赛作品 (只有学期改变,即EnrollmentBegin和EnrollmentEnd)。

FirstName LastName CollegeName State PublicPrivate EnrollmentBegin EnrollmentEnd
John      Doe    School A      NY       Public         20050829      20051223
John      Doe    School A      NY       Public         20051229      20060113
John      Doe    School A      NY       Public         20051223      20060513
John      Doe    School B      IL       Private        20090105      20090301
John      Doe    School B      IL       Private        20090706      20090830
John      Doe    School B      IL       Private        20090831      20091025
Jane      Doe    School A      IL       Private        20100105      20100301
Jane      Doe    School A      IL       Private        20100706      20100830
Jane      Doe    School A      IL       Private        20100831      20101025
John      Doe    School A      NY       Public         20110829      20111223
John      Doe    School A      NY       Public         20120129      20120513

这意味着对于一些学生,我有很多条目,其中学生的姓名和大学的名字是相同的。

我真的只想要每个新条目的第一个实例(即每当学校名称因给定学生而改变时) 但我也需要知道学生在该学校的入学时间何时结束。

此信息可在特定学校的每位学生的最后一个条目中找到。 所以我需要从最后一个条目中获取该值,并添加到该行的新列中,并为该学生提供第一个条目。

注意:我意识到有些学生,比如上面的John Doe,去了A学校,去了另一所学校,然后又回到了A学校。理想情况下,要抓住 那,我希望我的最终数据集看起来像这样:

FirstName LastName CollegeName State PublicPrivate EnrollmentBegin EnrollmentEnd EnrollmentEnd
John      Doe    School A      NY       Public      20050829      20051223      20060513
John      Doe    School A      NY       Public      20110829      20111223      20120513
John      Doe    School B      IL       Private     20090105      20090301      20091025
Jane      Doe    School A      IL       Private     20100105      20100301      20101025

如何以最有效的方式执行此操作?似乎min和max再也无法解决这个问题...

2 个答案:

答案 0 :(得分:4)

尝试

library(data.table)
setDT(df1)[,list(EnrollmentBegin= EnrollmentBegin[1L], 
                   EnrollmentEnd=EnrollmentEnd[1L], 
                   EnrollmentEnd2= EnrollmentEnd[.N]) ,
   by =c(names(df1)[1:5])]
#   FirstName LastName CollegeName State PublicPrivate EnrollmentBegin
#1:      John      Doe    School A    NY        Public        20050829
#2:      John      Doe    School B    IL       Private        20090105
#3:      Jane      Doe    School A    IL       Private        20100105
#   EnrollmentEnd EnrollmentEnd2
#1:      20051223       20060513
#2:      20090301       20091025
#3:      20100301       20101025

或使用dplyr

library(dplyr)
df1 %>%
  group_by_(.dots=names(df1)[1:5]) %>% 
  summarise(EnrollmentBegin=EnrollmentBegin[1L], 
            EnrollmentEnd1=EnrollmentEnd[1L],
            EnrollmentEnd2 = EnrollmentEnd[n()]) 

答案 1 :(得分:1)

使用基础R' someclass::someclass(){ member_timer = new QTimer(this); QObject::connect(member_timer, SIGNAL(timeout()), this, SLOT(check_time())); member_timer->start(30000); member_cleanup_performed = false; } void someclass::check_time(){ QTimer ctime = QTime::currentTime(); if(ctime.hour() == 3 && ctime.minute() == 0){ if(member_cleanup_performed == false){ this->cleanup(); member_cleanup_performed = true; } }else{ member_cleanup_performed = false; } }

的替代方案
lapply