我有一个包含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再也无法解决这个问题...
答案 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