从 n 行的字符串中提取一个单词并将该单词附加为 R 中的新列
Extracting a word from string from n rows and apend that word as a new col in R
我有一个包含 3 列并有 15565 个观察值的数据集。其中一列在同一行中有几个单词。
我想要做的是从每一行中提取一个特定的单词并将其附加到一个新列(我总共有 4 列)
问题是我要找的词不一样,而且它们并不总是在同一个位置。
这是我的 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
我希望提取所有以 3C
开头且长度为 10 个字符的单词,然后将其附加到新的列中,因此它看起来像这样:
x y z <br>
1 吨 3C00652722 (T558799A) 3C00652722
2 T NA >> MSP:T0578836A & 3C03024632 3C03024632
3 吨 T0579010A、3C03051500、EAET03051496 3C03051500
4 U T0023231A > MSP:T0577506A & 3C02808556 3C02808556
8 U >POPMigr.T576447A,C72/221816*3C00721502 3C00721502
我试过使用 stringr gprep 库但没有用。
我们可以用 str_extract
library(stringr)
df1$R <- str_extract(df1$z, "\b3C[^, ]{8}")
df1$R
#[1] "3C00652722" "3C03024632" "3C03051500" "3C02808556" "3C00721502"
虽然 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
我有一个包含 3 列并有 15565 个观察值的数据集。其中一列在同一行中有几个单词。 我想要做的是从每一行中提取一个特定的单词并将其附加到一个新列(我总共有 4 列) 问题是我要找的词不一样,而且它们并不总是在同一个位置。 这是我的 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
我希望提取所有以 3C
开头且长度为 10 个字符的单词,然后将其附加到新的列中,因此它看起来像这样:
x y z <br>
1 吨 3C00652722 (T558799A) 3C00652722
2 T NA >> MSP:T0578836A & 3C03024632 3C03024632
3 吨 T0579010A、3C03051500、EAET03051496 3C03051500
4 U T0023231A > MSP:T0577506A & 3C02808556 3C02808556
8 U >POPMigr.T576447A,C72/221816*3C00721502 3C00721502
我试过使用 stringr gprep 库但没有用。
我们可以用 str_extract
library(stringr)
df1$R <- str_extract(df1$z, "\b3C[^, ]{8}")
df1$R
#[1] "3C00652722" "3C03024632" "3C03051500" "3C02808556" "3C00721502"
虽然 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