dplyr:基于列匹配字符串的Mutate列

时间:2017-10-11 11:50:44

标签: r dplyr

我有这个数据帧ds:

sample
16LM1DNA
16M1DNA

我想在样本名称中创建一个关于LM或M的新列:

我有这段代码:

ds %>% 
mutate(group = case_when( 
matches(sample, "\\d+LMd+") ~ "LM",
matches(sample, "\\d+Md+") ~ "M"
)) 

但它没有用。

最佳

3 个答案:

答案 0 :(得分:2)

最后我这样做了:

ds %>% 
mutate(group = case_when( 
grepl("\\d+LMd+",sample ) ~ "LM",
grepl("\\d+Md+", sample) ~ "M"
)) 

答案 1 :(得分:1)

您可以使用gsubgrep在不同的行上使用基于正则表达式的解决方案,例如

df <- data.frame(sample=c('16LM1DNA', '16M1DNA', 'STUFF'))

ind <- grep("\\d+([A-Za-z]+).*", df$sample, value=FALSE)
df$label <- gsub('\\d+([A-Za-z]+).*', '\\1', df$sample)
df$label[-ind] <- ""
df

    sample label
1 16LM1DNA    LM
2  16M1DNA     M
3    STUFF      

Demo

grep的调用并不是答案的关键所在,但需要处理gsub中的模式与之匹配的边缘情况。默认情况下,gsub返回匹配的整个字符串,而我认为在这种情况下,空字符串会更有意义作为标签。

答案 2 :(得分:0)

base-R中的

ifelse可以提供帮助

> newdf <- data.frame(sample = c(
+                            '16LM1DNA',
+                            '16M1DNA'))
> 
> newdf$group <- ifelse(grepl('LM1',newdf$sample),'LM',
+                       ifelse(grepl('M1',newdf$sample),'M1',NA))
> 
> 
> newdf
    sample group
1 16LM1DNA    LM
2  16M1DNA    M1
>