替换字符串的一部分(文本挖掘)
Replace part of a string (text mining)
我想将字符串中的 "Replace" 部分从 df$x 替换为 df$y 列的第一个单词。我有一个这样的 df:
x y
ABC-Replace-YUI M46 Hello
CBD-Replace-TYU MD5 Hello
DBE-Replace-RTY M6 Hello
EBF-Replace-ERT M79 Hello
FBG-Replace-WER MMM8 Hello
我想获取以下数据:
x y
ABC-M46-YUI M46 Hello
CBD-MD5-TYU MD5 Hello
DBE-M6-RTY M6 Hello
EBF-M79-ERT M79 Hello
FBG-MMM8-WER MMM8 Hello
不幸的是,我没有文本挖掘方面的经验,我需要最有效的方法来做到这一点,因为我有一个巨大的数据集,每一行都有类似的替换。谢谢。
我们可以使用 str_replace
将 'Replace' 替换为 'y' 列中每个字符串的第一个单词(用 word
提取)
library(stringr)
df1$x <- str_replace(df1$x, "Replace", word(df1$y,1))
df1$x
#[1] "ABC-M46-YUI" "CBD-MD5-TYU" "DBE-M6-RTY" "EBF-M79-ERT" "FBG-MMM8-WER"
数据
df1 <- structure(list(x = c("ABC-Replace-YUI", "CBD-Replace-TYU", "DBE-Replace-RTY",
"EBF-Replace-ERT", "FBG-Replace-WER"), y = c("M46 Hello", "MD5 Hello",
"M6 Hello", "M79 Hello", "MMM8 Hello")), .Names = c("x", "y"),
class = "data.frame", row.names = c(NA, -5L))
您可以使用 stringi
包中的 stri_extract_first_words
获取第一个单词,然后使用 mapply
以矢量化方式应用 sub
函数
library(stringi)
df1$x <- mapply(sub, "Replace", stri_extract_first_words(df1$y), df1$x,
USE.NAMES = FALSE)
df1$x
#[1] "ABC-M46-YUI" "CBD-MD5-TYU" "DBE-M6-RTY" "EBF-M79-ERT" "FBG-MMM8-WER"
我猜想 -Replace- 指的是位置而不是确切的词,因此替换 Replace 本身是不正确的,但是要识别这个位置的-content-并替换它。
df1 <- data.frame(x = c("ABC-Replace-YUI",
"CBD-anything-TYU", "DBE-test-RTY",
"EBF-bad-ERT", "FBG-good-WER"),
y = c("M46 Hello", "MD5 Hello",
"M6 Hello", "M79 Hello",
"MMM8 Hello"))
x y
1 ABC-Replace-YUI M46 Hello
2 CBD-anything-TYU MD5 Hello
3 DBE-test-RTY M6 Hello
4 EBF-bad-ERT M79 Hello
5 FBG-good-WER MMM8 Hello
所以可以把-
和-
之间的内容替换成y中的第一个词。
library(stringr)
df1$x2 <- mapply(gsub,
"(?<=\-).*?(?=\-)",
word(df1$y,1), df1$x, perl = T)
df1
x y x2
1 ABC-Replace-YUI M46 Hello ABC-M46-YUI
2 CBD-anything-TYU MD5 Hello CBD-MD5-TYU
3 DBE-test-RTY M6 Hello DBE-M6-RTY
4 EBF-bad-ERT M79 Hello EBF-M79-ERT
5 FBG-good-WER MMM8 Hello FBG-MMM8-WER
我想将字符串中的 "Replace" 部分从 df$x 替换为 df$y 列的第一个单词。我有一个这样的 df:
x y
ABC-Replace-YUI M46 Hello
CBD-Replace-TYU MD5 Hello
DBE-Replace-RTY M6 Hello
EBF-Replace-ERT M79 Hello
FBG-Replace-WER MMM8 Hello
我想获取以下数据:
x y
ABC-M46-YUI M46 Hello
CBD-MD5-TYU MD5 Hello
DBE-M6-RTY M6 Hello
EBF-M79-ERT M79 Hello
FBG-MMM8-WER MMM8 Hello
不幸的是,我没有文本挖掘方面的经验,我需要最有效的方法来做到这一点,因为我有一个巨大的数据集,每一行都有类似的替换。谢谢。
我们可以使用 str_replace
将 'Replace' 替换为 'y' 列中每个字符串的第一个单词(用 word
提取)
library(stringr)
df1$x <- str_replace(df1$x, "Replace", word(df1$y,1))
df1$x
#[1] "ABC-M46-YUI" "CBD-MD5-TYU" "DBE-M6-RTY" "EBF-M79-ERT" "FBG-MMM8-WER"
数据
df1 <- structure(list(x = c("ABC-Replace-YUI", "CBD-Replace-TYU", "DBE-Replace-RTY",
"EBF-Replace-ERT", "FBG-Replace-WER"), y = c("M46 Hello", "MD5 Hello",
"M6 Hello", "M79 Hello", "MMM8 Hello")), .Names = c("x", "y"),
class = "data.frame", row.names = c(NA, -5L))
您可以使用 stringi
包中的 stri_extract_first_words
获取第一个单词,然后使用 mapply
sub
函数
library(stringi)
df1$x <- mapply(sub, "Replace", stri_extract_first_words(df1$y), df1$x,
USE.NAMES = FALSE)
df1$x
#[1] "ABC-M46-YUI" "CBD-MD5-TYU" "DBE-M6-RTY" "EBF-M79-ERT" "FBG-MMM8-WER"
我猜想 -Replace- 指的是位置而不是确切的词,因此替换 Replace 本身是不正确的,但是要识别这个位置的-content-并替换它。
df1 <- data.frame(x = c("ABC-Replace-YUI",
"CBD-anything-TYU", "DBE-test-RTY",
"EBF-bad-ERT", "FBG-good-WER"),
y = c("M46 Hello", "MD5 Hello",
"M6 Hello", "M79 Hello",
"MMM8 Hello"))
x y
1 ABC-Replace-YUI M46 Hello
2 CBD-anything-TYU MD5 Hello
3 DBE-test-RTY M6 Hello
4 EBF-bad-ERT M79 Hello
5 FBG-good-WER MMM8 Hello
所以可以把-
和-
之间的内容替换成y中的第一个词。
library(stringr)
df1$x2 <- mapply(gsub,
"(?<=\-).*?(?=\-)",
word(df1$y,1), df1$x, perl = T)
df1
x y x2
1 ABC-Replace-YUI M46 Hello ABC-M46-YUI
2 CBD-anything-TYU MD5 Hello CBD-MD5-TYU
3 DBE-test-RTY M6 Hello DBE-M6-RTY
4 EBF-bad-ERT M79 Hello EBF-M79-ERT
5 FBG-good-WER MMM8 Hello FBG-MMM8-WER