R 如何识别元素第一次出现的行?
我有以下学生记录的数据框架。我想确定的是2014年第一次参加某个项目的学生,当时他们在九年级R 如何识别元素第一次出现的行?,r,R,我有以下学生记录的数据框架。我想确定的是2014年第一次参加某个项目的学生,当时他们在九年级 names.first<-c('a','a','b','b','c','d') names.last<-c('c','c','z','z','f','h') year<-c(2014,2013,2014,2015,2015,2014) grade<-c(9,8,9,10,10,10) df<-data.frame(names.first,names.last,year,g
names.first<-c('a','a','b','b','c','d')
names.last<-c('c','c','z','z','f','h')
year<-c(2014,2013,2014,2015,2015,2014)
grade<-c(9,8,9,10,10,10)
df<-data.frame(names.first,names.last,year,grade)
df
然而,正如你所注意到的,这将包括2014年没有进入该课程的学生,比如2013年开始学习的学生A。我如何创建一个ifelse语句,其中我只捕获9年级的学生,并在2014年首次启动该计划,以便df看起来像
names.first names.last year grade first.cohort
1 a c 2014 9 0
2 a c 2013 8 0
3 b z 2014 9 1
4 b z 2015 10 0
5 c f 2015 10 0
6 d h 2014 10 0
我们可以在按“name”和“year”排列后使用first来创建逻辑表达式
library(dplyr)
df %>%
arrange(names, year) %>%
group_by(names) %>%
mutate(first.cohort = as.integer(grade == 9 & first(year) == 2014))
# A tibble: 6 x 4
# Groups: names [4]
# names year grade first.cohort
# <fct> <dbl> <dbl> <int>
#1 a 2013 8 0
#2 a 2014 9 0
#3 b 2014 9 1
#4 b 2015 10 0
#5 c 2015 10 0
#6 d 2014 10 0
或者对data.table使用相同的逻辑,这些逻辑具有与输入数据集中保持相同顺序的额外优势
library(data.table)
setDT(df)[order(names, year), first.cohort := as.integer(grade == 9 &
first(year) == 2014), names]
使现代化
对于OP文章中的新示例,我们按照“名称”列进行分组
df %>%
arrange(names.first, names.last, year) %>%
group_by(names.first, names.last) %>%
mutate(first.cohort = as.integer(grade == 9 & first(year) == 2014))
# A tibble: 6 x 5
# Groups: names.first, names.last [4]
# names.first names.last year grade first.cohort
# <fct> <fct> <dbl> <dbl> <int>
#1 a c 2013 8 0
#2 a c 2014 9 0
#3 b z 2014 9 1
#4 b z 2015 10 0
#5 c f 2015 10 0
#6 d h 2014 10 0
使用dplyr
对于data.table,rowid类似于withdf,rowidnames==1&year==2014&grade==9@Frank谢谢你的留言。用这种方法,你得到了两个正确的答案吗?setDTdf[,rowidnames==1&year==2014&grade==9][1]TRUE-FALSEFALSE@akrun我的实际数据集有名字和姓氏,我更新了示例以反映这一点。当我有名字和姓氏的时候,我怎么能下订单呢?@Nathan123更新了answer@akrun哦,我明白了,OP的数据由于某种原因没有排序,所以。。。df[orderyear,v:=rowidnames.first,names.last==1&year==2014&grade==9]
library(data.table)
setDT(df)[order(names, year), first.cohort := as.integer(grade == 9 &
first(year) == 2014), names]
df %>%
arrange(names.first, names.last, year) %>%
group_by(names.first, names.last) %>%
mutate(first.cohort = as.integer(grade == 9 & first(year) == 2014))
# A tibble: 6 x 5
# Groups: names.first, names.last [4]
# names.first names.last year grade first.cohort
# <fct> <fct> <dbl> <dbl> <int>
#1 a c 2013 8 0
#2 a c 2014 9 0
#3 b z 2014 9 1
#4 b z 2015 10 0
#5 c f 2015 10 0
#6 d h 2014 10 0
library(dplyr)
df%>%group_by(names)%>%dplyr::mutate(Fc=as.numeric((year==2014&grade==9)&(min(year)==2014)))
# A tibble: 6 x 4
# Groups: names [4]
names year grade Fc
<fctr> <dbl> <dbl> <dbl>
1 a 2014 9 0
2 a 2013 8 0
3 b 2014 9 1
4 b 2015 10 0
5 c 2015 10 0
6 d 2014 10 0