我在数据框列中有以下数据 -
X_ABC_123_DF</n>
A_NJU_678_PP</n>
J_HH_99_LL</n>
II_00_777_PPP</n>
我想为数据框中的每一行提取第二个和第三个下划线之间的值,我打算创建一个新列并存储这些值。我在下面提到的SO上找到了一种方法,但它们没有提到如何在R中写这个。我不知道如何编写它的正则表达式函数。
^(?:[^_]+_){2}([^_ ]+)<br>
extract word between 2nd underscore and 3rd underscore or space
答案 0 :(得分:3)
一些解决方案:
df$values = sapply(strsplit(df$V1, "_"), function(x) x[3])
df$values = gsub("(.*_){2}(\\d+)_.+", "\\2", df$V1)
library(dplyr)
library(stringr)
df %>%
mutate(values = str_extract(V1, "\\d+(?=_[a-zA-Z]+.+$)"))
<强>结果:强>
V1 values
1 X_ABC_123_DF</n> 123
2 A_NJU_678_PP</n> 678
3 J_HH_99_LL</n> 99
4 II_00_777_PPP</n> 777
数据:强>
df = read.table(text = "X_ABC_123_DF</n>
A_NJU_678_PP</n>
J_HH_99_LL</n>
II_00_777_PPP</n>", stringsAsFactors = FALSE)
答案 1 :(得分:1)
1)假设输入是一个数据框df
,其中包含一列V1
。使用read.table
与sep="_"
一起阅读,然后选出第三列。没有使用包或正则表达式。如果df$V1
已经是字符(而不是因素),则可以省略as.character
。
read.table(text = as.character(df$V1), sep = "_")$V3
## [1] 123 678 99 777
2)如果第三列是唯一一个包含数字的列(问题中的样本数据就是这种情况)那么将每个非数字替换为空就足够了字符串:
as.numeric(gusb("\\D", "", df$V1))
## [1] 123 678 99 777