R 如何识别元素第一次出现的行?

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

我有以下学生记录的数据框架。我想确定的是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,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