R 删除w行。重复信息,同时保留第一个非重复条目(并将重复条目中的数据追加到该行)

R 删除w行。重复信息,同时保留第一个非重复条目(并将重复条目中的数据追加到该行),r,dataframe,duplicate-removal,R,Dataframe,Duplicate Removal,我有一个包含500k个条目(行)的数据集。每个条目针对特定的学生,包含学生所在学校的信息 去了那个学期 因为学生们在同一所学校呆了几个学期,所以我有许多同一个学生和同一所学校的参赛作品 (只有学期发生变化,即注册开始和注册结束) 这意味着对于一些学生来说,我有很多条目,其中学生的名字和学院的名字是相同的 我真的只想要每个新条目的第一个实例(即,当给定学生的学校名称更改时) 但我还需要知道学生在那所学校的入学时间是什么时候结束的 该信息位于给定学校每个学生的最后一个条目中。 因此,我需要从最后一个

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

因为学生们在同一所学校呆了几个学期,所以我有许多同一个学生和同一所学校的参赛作品 (只有学期发生变化,即注册开始和注册结束)

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

我真的只想要每个新条目的第一个实例(即,当给定学生的学校名称更改时) 但我还需要知道学生在那所学校的入学时间是什么时候结束的

该信息位于给定学校每个学生的最后一个条目中。 因此,我需要从最后一个条目中获取该值,并将第一个条目添加到行中的新列中

NB:我意识到有些学生,比如上面的约翰·多伊,去了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再也不能解决这个问题了…

试试看

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()]) 
试一试

或者使用
dplyr

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

使用基本R的替代方案
lappy

lst = unname(split(dat, dat[,1:5])[lapply(split(dat, dat[,1:5]), nrow) != 0])
out = do.call(rbind, lapply(lst, 
              function(x){x$EnrollmentEnd.new = x$EnrollmentEnd[nrow(x)]; x[1,]}))

#> out
#  FirstName LastName CollegeName State PublicPrivate EnrollmentBegin
#7      Jane      Doe    School_A    IL       Private        20100105
#4      John      Doe    School_B    IL       Private        20090105
#3      John      Doe    School_A    NY        Public        20050829
#  EnrollmentEnd EnrollmentEnd.new
#7      20100301          20101025
#4      20090301          20091025
#3      20051223          20060513

使用基本R的替代方案
lappy

lst = unname(split(dat, dat[,1:5])[lapply(split(dat, dat[,1:5]), nrow) != 0])
out = do.call(rbind, lapply(lst, 
              function(x){x$EnrollmentEnd.new = x$EnrollmentEnd[nrow(x)]; x[1,]}))

#> out
#  FirstName LastName CollegeName State PublicPrivate EnrollmentBegin
#7      Jane      Doe    School_A    IL       Private        20100105
#4      John      Doe    School_B    IL       Private        20090105
#3      John      Doe    School_A    NY        Public        20050829
#  EnrollmentEnd EnrollmentEnd.new
#7      20100301          20101025
#4      20090301          20091025
#3      20051223          20060513

嘿,阿克伦。不,我只是想把这些值加粗,但我想我还是没有把格式写下来。看起来像是简单的分组最小最大运动。嘿,阿克伦。不,我只是想把这些值加粗,但我想我还是没有把格式写下来。看起来像是简单的“按最小值最大值分组”练习。这就成功了。我在考虑循环,但你刚才帮我节省了一些时间。谢谢成功了。我在考虑循环,但你刚才帮我节省了一些时间。谢谢另一个选项是
by
当我尝试使用unname命令时,我得到一条消息:“Error:cannotallocate vector of size 129.4 Gb”,即只有500行。为什么这似乎是个问题?@WykoW不太确定,但我想这可能是因为拆分后有多个空列表元素。谢谢你指点。我将尝试尽快解决此问题。如果另一个选项是by,当我尝试使用unname命令时,我会收到一条消息:“错误:无法分配大小为129.4 Gb的向量”,即只有500行。为什么这似乎是个问题?@WykoW不太确定,但我想这可能是因为拆分后有多个空列表元素。谢谢你指点。我会尽快解决这个问题