如何使用模式列表在列中查找字符串并将匹配的模式添加到下一列的同一行
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?