2014-12-05 58 views
0

连续答案我有数据设置如下(它是正下方的样品):选择中的R

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和for的是可以用data.table做到这一点吗?如何?

谢谢!

+1

你'必须解释'*在51之前询问145是第二个问题之后*“更好。 – Arun 2014-12-05 15:55:06

+1

ID是指问题的顺序。例如,对于下面的数据,第一个id是7,第二个是9,在这种情况下,它们不被要求作为pair,我必须放弃它。 example <-data.frame(“id”= c(7,9),“questionfk”= c(145,51)) 基本上,id应该是连续的 – user3122260 2014-12-05 16:04:50

回答

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 
+0

它当然会,非常感谢:) – user3122260 2014-12-05 16:55:40

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) 
+0

谢谢,我会尝试修改它并且我已经学会了新的东西感谢你:) – user3122260 2014-12-05 16:55:18