2015-10-06 44 views
2

我有樣本的受試者的數據框架和這些樣本中的濃度。我想要的是獲得受試者的矢量,其對於任何樣本都具有濃度012並且對於該同一個對象的任何其他樣本也≥2。找到對於任何樣本的值<2且對於任何其他樣本的> = 2的受試者

ex <- data.frame(subj = rep(1:6, each = 2), 
      sampleID = 1:12, 
      conc = c(1.7, 1.4, 1.5, 3.2, 3.3, 1.6, 2.7, 2.8, 1.4, NA, NA, 3.9)) 

這是很容易找到的任何樣本中有濃< 2的主旨:

ex %>%     # conc < 2 
    filter(conc < 2) %>% 
    print() %>% 
    distinct(subj) %>% 
    summarise(n()) 

但我需要的是找到SUBJ有濃< 2任何樣品中也在同一患者的任何其他樣本中的濃度> 2。這是我迄今爲止,但它不起作用。正確的答案只有兩個主題(#2和#3)的濃度均爲< 2,並且> = 2。

ex %>%     # concs < 2 and also > 2 for each subject 
    mutate(lt = ifelse(.$conc < 2, TRUE, FALSE)) %>% 
    mutate(ge = ifelse(.$conc >= 2, TRUE, FALSE)) %>% 
    group_by(subj) %>% 
    summarise(xor(any(.$lt), any(.$ge))) 

我強烈希望使用dplyr和magrittr管道的解決方案。 在此先感謝。

回答

2

隨着dplyr

ex %>% 
    group_by(subj) %>% 
    filter(any(conc < 2) & any(conc >=2)) 

注:這將返回全套。如果你只想要科目,你可以將它修改爲:

ex %>% 
    group_by(subj) %>% 
    filter(any(conc < 2) & any(conc >=2)) %>% 
    distinct(subj) %>% 
    select(subj) 

如果您想更詳細,你可以做這樣的事情:

less_than_2 <- ex %>% 
    group_by(subj) %>% 
    filter(conc < 2) 

greater_than_or_2 <- ex %>% 
    group_by(subj) %>% 
    filter(conc >= 2) 

intersect(less_than_2$subj, greater_than_or_2$subj) 
+0

完美的答案。謝謝。這讓我fl me了好一陣子 – hackR

2

不dplyr,但data.table:

setDT(ex)[, .(select = any(conc < 2) & any(conc >=2)), by=subj] 

返回:

subj select 
1: 1 FALSE 
2: 2 TRUE 
3: 3 TRUE 
4: 4 FALSE 
5: 5  NA 
6: 6  NA 

如果你想SUBJ的只是數據,而且select向量爲TRUE:

setDT(ex)[, .(select = any(conc < 2) & any(conc >=2)), by=subj][ 
    select==T, subj] 

如果您想刪除NA v,您可以將na.rm=T添加到any調用中alues。

+0

第二個標準版本會是什麼樣'如果(條件).SD,通過= subj' – Frank

1

,如果你想這不是我清楚保留原始數據框,併爲符合條件的主題添加標記,或篩選符合條件的主題。如果是後者,傑森的答案已經涵蓋了。如果是前者,你可以這樣做:

ex %>% 
    group_by(subj) %>% 
    summarise(test = min(conc) < 2 & max(conc) >= 2) %>% 
    left_join(ex, .) 
相關問題