2016-10-03 77 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