首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据逻辑值是否具有以前的值插入逻辑值?

如何根据逻辑值是否具有以前的值插入逻辑值?
EN

Stack Overflow用户
提问于 2018-09-26 19:41:50
回答 2查看 60关注 0票数 1

我有以下学生的data.frame,他们加入了一个特定的项目

代码语言:javascript
复制
library(data.table)

f.name<-c('a','a','b','b','b','c','c')
year<-c(2014,2015,2013,2014,2015,2015,2016)
grade<-c(9,10,8,9,10,7,8)

f.name<-as.character(f.name)

df.have<-data.frame(f.name,year,grade)
df.have

我特别感兴趣的是九年级学生,他们在2014年加入了一个特定的项目。然而,我想区分2014年第一次参加这个项目的9年级学生和即将返回该项目的9年级学生(2013年是8年级学生)。

我创建了一个列来区分在2014年第一次加入这个项目的九年级学生,其方式如下

代码语言:javascript
复制
df.have$new.students<-with(df.have, rowid(f.name) == 1 & year == 2014 & grade == 9)
df.have
  f.name year grade new.students
1      a 2014     9         TRUE
2      a 2015    10        FALSE
3      b 2013     8        FALSE
4      b 2014     9        FALSE
5      b 2015    10        FALSE
6      c 2015     7        FALSE
7      c 2016     8        FALSE

如何创建另一列来标记返回的学生。2013年上八年级,2014年返校的学生?所以它看起来像这样

代码语言:javascript
复制
  f.name year grade new.student returning.students
1      a 2014     9        TRUE    FALSE
2      a 2015    10       FALSE    FALSE
3      b 2013     8       FALSE    FALSE
4      b 2014     9       FALSE    TRUE
5      b 2015    10       FALSE    FALSE
6      c 2015     7       FALSE    FALSE
7      c 2016     8       FALSE    FALSE
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-26 20:06:50

可以使用联接查找所需的行。

代码语言:javascript
复制
library(data.table)
setDT(df.have)

# initialize to FALSE
df.have[, rs := FALSE]

# update to TRUE if the desired row is found
df.have[year == 2014 & grade == 9, rs := 
  df.have[replace(copy(.SD), c("year", "grade"), list(2013, 8)), on=.(f.name, year, grade), .N, by=.EACHI]$N > 0L
]

这可以用by=anycumsum来完成,但我认为效率较低:

代码语言:javascript
复制
df.have[, v := 
  year == 2014 & grade == 9 & any(year == 2013 & grade == 8)
, by=f.name]

# or...
df.have[order(year), v := 
  year == 2014 & grade == 9 & cumsum(year == 2013 & grade == 8)
, by=f.name]
票数 3
EN

Stack Overflow用户

发布于 2018-09-26 19:47:22

如果您愿意使用dplyr,可以使用group_by并利用row_number()函数。

代码语言:javascript
复制
library(dplyr)
df.have %>% 
  group_by(f.name) %>% 
  mutate(new_student = (grade == 9 & year == 2014 & row_number() == 1), 
         returning_student = (grade == 9 & year == 2014 & row_number() > 1)) %>%
  ungroup()

  f.name  year grade new_student returning_student
  <fct>  <dbl> <dbl> <lgl>       <lgl>            
1 a       2014     9 TRUE        FALSE            
2 a       2015    10 FALSE       FALSE            
3 b       2013     8 FALSE       FALSE            
4 b       2014     9 FALSE       TRUE             
5 b       2015    10 FALSE       FALSE            
6 c       2015     7 FALSE       FALSE            
7 c       2016     8 FALSE       FALSE

不幸的是,我对data.table不是很熟悉,所以我不能给出一个特定于这个包的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52525017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档