在R

时间:2017-10-05 17:33:11

标签: r

我在数据框列中有以下数据 -

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

2 个答案:

答案 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.tablesep="_"一起阅读,然后选出第三列。没有使用包或正则表达式。如果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