如何使用模式列表在列中查找字符串并将匹配的模式添加到下一列的同一行

Posted

技术标签:

【中文标题】如何使用模式列表在列中查找字符串并将匹配的模式添加到下一列的同一行【英文标题】:How to find a string in a column using a list of patterns and add the matched pattern to the same row in next column 【发布时间】:2020-07-04 11:10:30 【问题描述】:

我有一个包含 RNASeq 样本、基因符号和表达数据的数据框。我想根据样本类别对它们进行分组。

Sample             Gene     Exp 
---------------------------------
A.56.100e.ax       prk1     3.56
A.100CAS.500e.er   prk1    45.20 
A.300.EFE1.cx      prk1     0.21
A.56.100e.ax       csk     51.50
A.100CAS.500e.er   csk    321.47 
A.300.EFE1.cx      csk    186.78

我想做的是在单独的列中添加一个类别,如下所示,

Sample             Gene     Exp    Category
-------------------------------------------
A.56.100e.ax       prk1     3.56   A.56
A.100CAS.500e.er   prk1    45.20   A.100CAS
A.300.EFE1.cx      prk1     0.21   A.300
A.56.100e.ax       csk     51.50   A.56
A.100CAS.500e.er   csk    321.47   A.100CAS
A.300.EFE1.cx      csk    186.78   A.300

谢谢

【问题讨论】:

【参考方案1】:

我们可以使用sub 来捕获一个字符后跟一个数字。

df$Category <- sub('([A-Z]\\..*?)\\..*', '\\1', df$Sample)
df

#            Sample Gene    Exp Category
#1     A.56.100e.ax prk1   3.56     A.56
#2 A.100CAS.500e.er prk1  45.20 A.100CAS
#3    A.300.EFE1.cx prk1   0.21    A.300
#4     A.56.100e.ax  csk  51.50     A.56
#5 A.100CAS.500e.er  csk 321.47 A.100CAS
#6    A.300.EFE1.cx  csk 186.78    A.300

数据

df <- structure(list(Sample = structure(c(3L, 1L, 2L, 3L, 1L, 2L), 
    .Label = c("A.100CAS.500e.er", "A.300.EFE1.cx", "A.56.100e.ax"), 
    class = "factor"), Gene = structure(c(2L, 2L, 2L, 1L, 1L, 1L),
    .Label = c("csk", "prk1"), class = "factor"), 
     Exp = c(3.56, 45.2, 0.21, 51.5, 321.47, 186.78)), 
   class = "data.frame", row.names = c(NA, -6L))

【讨论】:

大家好,我尝试了两个答案,发现有些样本在数字后包含字母(例如:A.100CAS)。所以,这使它变得复杂。我尝试使用您的两种解决方案来解决问题并找到了解决方案。 df$Category @RusiruHemage 我已经为你的新数据更新了答案。【参考方案2】:

我们可以使用str_remove 匹配. 后跟一个或多个不是. 的字符,直到字符串的末尾($

library(stringr)
df1 %>%
    mutate(Category = str_remove(Sample, "\\.[^.]+$"))

base R

df$Category <- sub("\\.[^.]+$", "", df1$Sample)

【讨论】:

大家好,我尝试了两个答案,发现有些样本在数字后包含字母(例如:A.100CAS)。所以,这使它变得复杂。我尝试使用您的两种解决方案来解决问题并找到了解决方案。 @RusiruHemage 这有点难,尤其是当您使用该模式发布问题然后更改它并且有人提出调整后的解决方案时。

以上是关于如何使用模式列表在列中查找字符串并将匹配的模式添加到下一列的同一行的主要内容,如果未能解决你的问题,请参考以下文章

Telerik MVC Grid:如何在列中使用 DropDownList?

R - 在列中查找模式并替换它(更有效的解决方案)

用于在列1中选择与第2列中的两个模式之一匹配的值对的SQL查询

在列中查找值,填充'直到非空白单元格

如何使用 SQL LIKE 运算符在列中搜索精确模式?

如果它们与使用 vba 的条件匹配,则在列中查找最小值和中值