2017-08-17 48 views
1

我有兩個DF中的R(甲基=一些冗餘信息)具有多個正則表達式dplyr過濾柱

DF1:

   id value1 value2 value3 value4 
id1_meta_meta-meta 4.93 13.93 16.8 35.39 
id2_meta_meta-meta 28.63 45.43 30.52 61.71 
id3_meta_meta-meta 3.35 1.26 7.98 4.43 
id4_meta_meta-meta 16.78 50.47 32.48 55.52 
id5_meta_meta-meta 474.23 807.71 664.45 442.55 
id6_meta_meta-meta 26.26 32.83 24.64 41.58 
id7_meta_meta-meta 230.1 202.93 166.71 295.48 
id8_meta_meta-meta 651.21 1282.71 1012.28 2650.21 

DF2:

V1 
id1 
id2 
id3 
id4 
id5 

問題

嘗試根據df2中的ID篩選df1中的行

代碼

library(dplyr) 
library(stringr) 
df.common = df1 %>% 
    filter(str_detect(id, '*_') %in% df2$V1) 

錯誤

Error in filter_impl(.data, quo) : 
    Evaluation error: Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX). 

所需的輸出

df.common:

   id value1 value2 value3 value4 
id1_meta_meta-meta 4.93 13.93 16.8 35.39 
id2_meta_meta-meta 28.63 45.43 30.52 61.71 
id3_meta_meta-meta 3.35 1.26 7.98 4.43 
id4_meta_meta-meta 16.78 50.47 32.48 55.52 
id5_meta_meta-meta 474.23 807.71 664.45 442.55 
+0

如果你改變了'filter'條件'過濾器(str_detect(ID,DF2 $ V1))您的原始代碼將工作' –

+0

@JakeKaupp我得到這個錯誤'警告消息: 在stri_detect_regex(字符串,模式,opts_regex = opts(pattern)): 較長的對象長度不是較短的對象長度的倍數 – sbradbio

+0

這是一個警告,而不是一個錯誤,並導致您所需的輸出。 –

回答

1
  1. 使用gsub修剪iddf1

    • gsub("_.*", "", df1$id)會後_
  2. 檢查什麼修剪id的是df2$V2刪除一切(這將返回行號)

  3. df1

    提取的行
    df1[gsub("_.*", "", df1$id) %in% df2$V2, ] 
    
+0

它的工作原理,你可以評論什麼是去幫助學習,謝謝 – sbradbio

+0

真棒,感激它! – sbradbio

+0

@sbradbio如果這是你想要的,你可以接受我的答案,然後 – PoGibas

3

如果您使用dplyrstringr,您也可以考慮採用這種方法。 str_replace_all就像gsubsemi_join是一種「過濾連接」,允許您在df2中只保留找到匹配的記錄。

library(dplyr) 
library(stringr) 

df3 <- df1 %>% 
    mutate(id2 = str_replace_all(id, "_.*", "")) %>% 
    semi_join(df2, by = c("id2" = "V1")) %>% 
    select(-id2) 

df3 
        id value1 value2 value3 value4 
1 id1_meta_meta-meta 4.93 13.93 16.80 35.39 
2 id2_meta_meta-meta 28.63 45.43 30.52 61.71 
3 id3_meta_meta-meta 3.35 1.26 7.98 4.43 
4 id4_meta_meta-meta 16.78 50.47 32.48 55.52 
5 id5_meta_meta-meta 474.23 807.71 664.45 442.55 
+0

我會嘗試這個,但糾正我,如果我錯了@PoGibas答案是一個班輪和簡潔。 – sbradbio

+0

呃...如果您只想看到最簡潔的答案,我會很快刪除我的答案。如果您想了解更多關於'dplyr'和'stringr'的使用方法,請使用這些軟件包,我會將我的答案保留爲可選方法。你說什麼? – www

+0

當然,我已經接受它絕對是你的正確它可以是可選的方式。 – sbradbio