我的数据集如下(这只是下面的示例):
dataframe<-data.frame("id" = c(1,2,5,7,9,21,22,23),"questionfk"=c(145,51,51,145,145,51,145,51))
在此数据中,id表示问题的顺序。 Questionfk,是问题ID。
我想在questionfk 145和51上过滤这些数据,其中145是在51之后第二个问题之前被问到的。所以我最终想要的是以下内容:
dataframefiltered<-data.frame("id" = c(1,2,22,23),"questionfk"=c(145,51,145,51))
我用很多if来做这件事,并且可以用data.table来做这件事吗?如何?
谢谢!
答案 0 :(得分:1)
可能有帮助
library(data.table)
setDT(dataframe)[dataframe[, {indx=which(c(TRUE, questionfk[-1]==145 &
questionfk[-.N]==51) & c(TRUE, diff(id)==1))
sort(c(indx, indx+1))}]]
# id questionfk
#1: 1 145
#2: 2 51
#3: 22 145
#4: 23 51
答案 1 :(得分:0)
我不确定我是否理解你正在寻找的确切条件,但我的基础是想要选择问题145和51,但只有当它按顺序连续出现时才会这样。我意识到这并没有给出与你展示的相同的结果,但可能你可以修改它以匹配正确的条件。
而不是data.table,这里有一种方法可以使用dplyr(大数据集也很快,非常优雅):
dataframe %>%
mutate(last_question = lag(questionfk),
next_question = lead(questionfk),
after_145 = last_question==145,
before_51 = next_question==51) %>%
filter(after_145 | before_51) %>%
select(id, questionfk)