从n行中提取字符串中的单词,并将该单词作为R中的新col添加

问题描述 投票:2回答:2

我有一个包含3列的数据集,有15565个观测值。其中一列已在同一行中有多个单词。我想要做的是从每一行中提取一个特定的单词并将其附加到一个新列(我将总共有4个col)问题是我正在寻找的单词不一样而且它们不是总是在同一个位置。这是我DS的摘录:

x y z 1 T 3C00652722 (T558799A) 2 T NA >> MSP: T0578836A & 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 4 U T0023231A > MSP: T0577506A & 3C02808556 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502

我希望提取所有以3Cand开头的单词是10个字符长,然后将其附加到新的col,所以它看起来像这样:

x y z R
1 T 3C00652722 (T558799A) 3C00652722 2 T NA >> MSP: T0578836A & 3C03024632 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 3C03051500 4 U T0023231A > MSP: T0577506A & 3C02808556 3C02808556 8 U >POPMigr.T576447A,C72/221816*3C00721502 3C00721502

我尝试过使用stringr gprep库但没有用。

r string extract
2个回答
5
投票

我们可以用str_extract做到这一点

library(stringr)
df1$R <- str_extract(df1$z, "\\b3C[^, ]{8}")
df1$R
#[1] "3C00652722" "3C03024632" "3C03051500" "3C02808556" "3C00721502"

2
投票

虽然akrun's解决方案是简单而优雅的方式,但为了我的缘故,我发布了另一种基于stringr库和substring方法的解决方案。

library(stringr)

x <- c(1,2,3,4,8)
y <- c('T','T','T','U','U')
z <- c('3C00652722 (T558799A)', 'NA >> MSP: T0578836A & 3C03024632', 'T0579010A, 3C03051500, EAET03051496',
   'T0023231A > MSP: T0577506A & 3C02808556', '(T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502')

dt <- data.frame(x,y,z)

charLoc <- str_locate(pattern = "3C", dt$z)
idx <- list()
for (s in 1:dim(charLoc)[1]) {
  idx[s] <- substring(dt$z[s], first = charLoc[s,][1], last = charLoc[s,][1]+9)
}
dt$val <- sapply(idx, paste0, collapse=",")
print(head(dt))

并且它的输出是

  x y                                                           z        val
1 1 T                                       3C00652722 (T558799A) 3C00652722
2 2 T                           NA >> MSP: T0578836A & 3C03024632 3C03024632
3 3 T                         T0579010A, 3C03051500, EAET03051496 3C03051500
4 4 U                     T0023231A > MSP: T0577506A & 3C02808556 3C02808556
5 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502 3C00721502
© www.soinside.com 2019 - 2024. All rights reserved.