2016-10-03 44 views
2

我试图从下面的数据框中选择数值为2的数字,这些数字在num列中的值为至少间隔2行。换言之,给出的以下的数据帧:根据列中两行之间的距离选择因子

df2 <- data.frame(id=c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,3), 
       num=c(1,2,1,1,2,1,1,1,2,2,1,1,1,2,2)) 
df2$id <- as.factor(df2$id) 

如何可以选择ID的变量,使得2值由至少一排分离?

我正在寻找的过程的结果会选择id 1,因为2的值至少被一行(本例中为2行)分隔。谢谢。

此外,该解决方案如下似乎并没有在下面的示例工作:

df <- data.frame(
    id=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4), 
    num=c(1,2,1, 1,2,2, 1,1,1,2,2,1, 1,1,1,2,2,1, 1,2,1,2,2,2) 
)  
df$id<-as.factor(df$id) 

再次,结果应该是唯一的ID 1.我只是想找到,每个ID,任何情况下,在数字2被另一个2分隔一行或多行。

+1

更正,谢谢。 – user85727

+0

第二个例子的预期输出是多少? – Frank

+0

与第一个相同。我只想为每个ID找到数字2被另一个2分隔一个或多个行的任何实例。 – user85727

回答

6

data.table我会用data.table包:

library(data.table) 
setDT(df) 

df[num == 2, .N > 1L && any(diff(.I) > 2L), by=id] 

    id V1 
1: 1 TRUE 
2: 2 FALSE 
3: 3 FALSE 

工作原理:语法DT[i, j, by]

  • i亚行
  • 然后by组其余行
  • 然后j计算

里面j我们.I,存储行号的方便;和.Nby组中的行数。所以要提取ID有V1 == TRUE,我们可以做res[V1 == TRUE, id]。可替换地,整个操作可以链接等

df[num == 2, .N > 1L && any(diff(.I) > 2L), by=id][V1 == TRUE, id] 

[1] 1 
Levels: 1 2 3 

碱或dplyr在基础R的(几乎)类似物是

sapply(split(df$num == 2, df$id), function(x){ 
    w = which(x) 
    length(w) > 1L && any(diff(w) > 2L) 
}) 

    1  2  3 
TRUE FALSE FALSE 

后者也适用于dplyr

library(dplyr) 

df %>% group_by(id) %>% summarise(x = { 
    w = which(num == 2) 
    length(w) > 1L && any(diff(w) > 2L) 
}) 

# A tibble: 3 x 2 
     id  x 
    <fctr> <lgl> 
1  1 TRUE 
2  2 FALSE 
3  3 FALSE 
+0

如果数据帧的格式如下,您的解决方案是否可以推广:df <-data.frame(id = c(1,1,1,1,1,1,2,2,2,2,2,2) ,3,3,3,3,3,3,4,4,4,4,4,4),num = c(1,2,1,1,2,2,1,1,1,2, 2,1,1,1,1,2,2,1,1,2,1,2,2,2)) df $ id <-as.factor(df $ id) – user85727

+0

@ user85727你可以把它作为问题的另一个例子?从评论中复制粘贴很困难。 – Frank

+0

已被添加到问题,谢谢 – user85727