我有这个数据帧ds:
sample
16LM1DNA
16M1DNA
我想在样本名称中创建一个关于LM或M的新列:
我有这段代码:
ds %>%
mutate(group = case_when(
matches(sample, "\\d+LMd+") ~ "LM",
matches(sample, "\\d+Md+") ~ "M"
))
但它没有用。
最佳
答案 0 :(得分:2)
最后我这样做了:
ds %>%
mutate(group = case_when(
grepl("\\d+LMd+",sample ) ~ "LM",
grepl("\\d+Md+", sample) ~ "M"
))
答案 1 :(得分:1)
您可以使用gsub
和grep
在不同的行上使用基于正则表达式的解决方案,例如
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
对grep
的调用并不是答案的关键所在,但需要处理gsub
中的模式与之匹配的边缘情况。默认情况下,gsub
返回匹配的整个字符串,而我认为在这种情况下,空字符串会更有意义作为标签。
答案 2 :(得分:0)
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
>