R 删除w行。重复信息,同时保留第一个非重复条目(并将重复条目中的数据追加到该行)
我有一个包含500k个条目(行)的数据集。每个条目针对特定的学生,包含学生所在学校的信息 去了那个学期 因为学生们在同一所学校呆了几个学期,所以我有许多同一个学生和同一所学校的参赛作品 (只有学期发生变化,即注册开始和注册结束) 这意味着对于一些学生来说,我有很多条目,其中学生的名字和学院的名字是相同的 我真的只想要每个新条目的第一个实例(即,当给定学生的学校名称更改时) 但我还需要知道学生在那所学校的入学时间是什么时候结束的 该信息位于给定学校每个学生的最后一个条目中。 因此,我需要从最后一个条目中获取该值,并将第一个条目添加到行中的新列中 NB:我意识到有些学生,比如上面的约翰·多伊,去了A学校,去了另一所学校,然后又回到A学校。所以理想的情况是,去捕捉 因此,我希望我的最终数据集如下所示:R 删除w行。重复信息,同时保留第一个非重复条目(并将重复条目中的数据追加到该行),r,dataframe,duplicate-removal,R,Dataframe,Duplicate Removal,我有一个包含500k个条目(行)的数据集。每个条目针对特定的学生,包含学生所在学校的信息 去了那个学期 因为学生们在同一所学校呆了几个学期,所以我有许多同一个学生和同一所学校的参赛作品 (只有学期发生变化,即注册开始和注册结束) 这意味着对于一些学生来说,我有很多条目,其中学生的名字和学院的名字是相同的 我真的只想要每个新条目的第一个实例(即,当给定学生的学校名称更改时) 但我还需要知道学生在那所学校的入学时间是什么时候结束的 该信息位于给定学校每个学生的最后一个条目中。 因此,我需要从最后一个
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不太确定,但我想这可能是因为拆分后有多个空列表元素。谢谢你指点。我会尽快解决这个问题