簡體   English   中英

使用 R 中的正則表達式替換 dataframe 列中的元素

[英]Replacing elements in a column of a dataframe by using regular expressions in R

df是一個測試 dataframe 並且是我原來的 dataframe 的一個子集,它有 ~1000000 行和 21 列。

df <- data.frame(
 Hits = c("# test1", "#  Query: tr|A4I9M8|A4I9M8_LEIIN", "# 13135", "tr|E9BQL4|E9BQL4_LEIDB", 
       "tr|A4I9M8|A4I9M8_LEIIN", "tr|A0A3Q8IUE6|A0A3Q8IUE6_LEIDO", "tr|Q4Q3E9|Q4Q3E9_LEIMA", 
       "tr|A0A640KX53|A0A640KX53_LEITA", "# test2", "# Query: tr|E9AH01|E9AH01_LEIIN", "# 83771", 
       "tr|A0A6L0XNG2|A0A6L0XNG2_LEIIN", "tr|E9AH01|E9AH01_LEIIN", "tr|A0A6J8FCW4|A0A6J8FCW4_LEIDO", 
       "tr|A0A6J8FCW4|A0A6J8FCW4_LEIDO"),
 Category1 = c(NA, NA, NA, 0.001, 0.001, 0.002, 0.003, 0.003, NA, NA, NA, 0.023, 0.341, 0.341, 0.569),
 Category2 = c(NA, NA, NA, 100, 100, 99, 98, 98, NA, NA, NA, 100, 95, 95, 97),
 Category3 = c(NA, NA, NA, 100, 100, 99, 98, 98, NA, NA, NA, 98, 97, 97, 92))

df看起來像這樣

在此處輸入圖像描述

Hits列中,不以#開頭的元素將替換為位於|的前兩次出現之間的部分。 . 我想出的提取這部分的正則表達式是

^.*?(\\b[A-Z][^|]*).*

output 應如下所示

在此處輸入圖像描述

我似乎無法弄清楚如何用提取的部分替換元素。 在這種情況下,我可以考慮使用條件循環。 但考慮到原始 dataframe 的大小,我不確定這是否是解決此問題的有效方法,因為 R 中的循環往往較慢。 有人可以提出另一種方法,最好是矢量化解決方案來解決這個問題嗎?

您可以在mutate()中使用gsub() ) 來完成這項工作。

library(tidyverse)

# my original answer
df %>% mutate(Hits = gsub("^[^#].+?((?<=\\|).+?(?=\\|)).*", "\\1", Hits, perl = T))

或者

# OP's regex
df %>% mutate(Hits = gsub("^[^#].*?(\\b[A-Z][^\\|]*).*", "\\1", Hits, perl = T))

兩者都生成相同的 output。

Output

# A tibble: 15 x 4
   Hits                             Category1 Category2 Category3
   <chr>                                <dbl>     <dbl>     <dbl>
 1 # test1                             NA            NA        NA
 2 #  Query: tr|A4I9M8|A4I9M8_LEIIN    NA            NA        NA
 3 # 13135                             NA            NA        NA
 4 E9BQL4                               0.001       100       100
 5 A4I9M8                               0.001       100       100
 6 A0A3Q8IUE6                           0.002        99        99
 7 Q4Q3E9                               0.003        98        98
 8 A0A640KX53                           0.003        98        98
 9 # test2                             NA            NA        NA
10 # Query: tr|E9AH01|E9AH01_LEIIN     NA            NA        NA
11 # 83771                             NA            NA        NA
12 A0A6L0XNG2                           0.023       100        98
13 E9AH01                               0.341        95        97
14 A0A6J8FCW4                           0.341        95        97
15 A0A6J8FCW4                           0.569        97        92

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM