数据框df含有品种来源列文本类型利用R的stringr包提取该列的所有指定字符指定字符为数字个数未知且前面为英文字母无论大小写个数未知字母与数字之间可能含有-或者x且字母或数字之间可能含有-将结果添加到新列新列名称为亲本若含有多个指定字符以顿号隔开
可以使用正则表达式来提取符合条件的字符串,并使用stringr包中的函数进行操作。
假设数据框df中含有品种来源列为varieties,可以使用如下代码来生成新列:
library(stringr)
df$parent <- str_extract_all(df$varieties, "(?<=[A-Za-z])[A-Za-z-]*[0-9xX]+[A-Za-z0-9-]*(?=[^A-Za-z0-9-]|$)") %>%
lapply(function(x) paste(x, collapse = ", ")) %>%
unlist()
解释一下上述代码:
-
str_extract_all函数用来提取所有符合条件的字符串,其中正则表达式的含义为:(?<=[A-Za-z])表示要匹配的字符串前面必须是一个英文字母(不论大小写)[A-Za-z-]*表示匹配任意个英文字母或连字符(-)[0-9xX]+表示匹配至少一个数字(包括x或X)[A-Za-z0-9-]*表示匹配任意个数字、英文字母或连字符(?=[^A-Za-z0-9-]|$)表示要匹配的字符串后面必须是除数字、字母、连字符之外的字符,或者是字符串末尾
-
lapply和paste函数用来将每个符合条件的字符串拼接成以逗号分隔的字符串 -
unlist函数用来将结果转换为向量
注意:上述代码中,如果新列中的元素为空,则表示该行数据不符合条件。如果需要将其转换为NA值,可以使用如下代码:
df$parent[df$parent == ""] <- NA
原文地址: https://www.cveoy.top/t/topic/b5nE 著作权归作者所有。请勿转载和采集!