【问题标题】:Extract value between second and third underscore in R提取R中第二个和第三个下划线之间的值
【发布时间】:2018-03-17 10:15:36
【问题描述】:

我在数据框列下面有一个数据-

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

【问题讨论】:

  • 使用正则表达式进行如此简单的操作似乎很愚蠢。只需拆分下划线并选择第二个值。在 Python 和 Ruby 中:"X_ABC_123_DF".split("_")[1].

标签: r


【解决方案1】:

一些解决方案:

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)

【讨论】:

  • 这段代码会自动提取N个数据行吗? ,以及输出,能否以列格式存储在我们用于提取的原始数据列旁边?
  • @Joe 你当然可以!所有三种解决方案都是矢量化的,这意味着无论行数如何,它都可以工作。另请注意,对于前两个,我没有使用mutate 仅保留Base R。查看我的更新。
  • 这就像一个魅力。我最初认为,因为有多个列,它会删除它们并且只有值列。但是它保留了所有列并在最后添加了值列,这很棒
【解决方案2】:

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(gsub("\\D", "", df$V1))
## [1] 123 678  99 777

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多