R 中 "dictionary" 数据帧的多个模式和替换,可能使用 gsub?
Multiple patterns and replacements from "dictionary" dataframe in R, maybe with gsub?
我有一个包含字符串 (data$text) 的数据集,其中包含表情符号的名称而不是实际图像(例如,FACE_WITH_TEARS_OF_JOY
)。现在我试图用实际的表情符号替换每个表情符号名称。名称和表情符号保存在一个额外的数据集中,该数据集用作“字典”(emojis$name
和 emojis$emoji
)。
所以这是我的数据集:
data <- structure(list(text = c("blabla HUGGING_FACE PARTY_POPPER", "bla FACE_WITH_TEARS_OF_JOY bla FACE_WITH_TEARS_OF_JOY", "PARTY_POPPER")), class = "data.frame", row.names = c(NA, -3L))
看起来像:
text
1 blabla HUGGING_FACE PARTY_POPPER
2 bla FACE_WITH_TEARS_OF_JOY bla FACE_WITH_TEARS_OF_JOY
3 PARTY_POPPER
请注意,表情符号名称只是文本的一部分。其余文字应保留。
这是我的“字典”:
emojis <- structure(list(name = c("FACE_WITH_TEARS_OF_JOY", "HUGGING_FACE",
"PARTY_POPPER"), emoji = c("\U0001f602", "\U0001f917", "\U0001f389"
)), class = "data.frame", row.names = c(NA, -3L))
看起来像:
name emoji
1 FACE_WITH_TEARS_OF_JOY \U0001f602
2 HUGGING_FACE \U0001f917
3 PARTY_POPPER \U0001f389
对于单个表情符号,此代码有效:
data$text <- gsub("FACE_WITH_TEARS_OF_JOY", "\U0001f602", data$text)
结果是:
text
1 blabla HUGGING_FACE PARTY_POPPER
2 bla \U0001f602 bla \U0001f602
3 PARTY_POPPER
但是,我也想替换其他表情符号名称。结果应该是:
text
1 blabla \U0001f917 \U0001f389
2 bla \U0001f602 bla \U0001f602
3 \U0001f389
由于有成千上万的表情符号,我需要这样的东西:
data$text <- gsub(emojis$name, emojis$emoji, data$text)
这不起作用(错误:“参数 'pattern' 的长度 > 1,并且只有第一个元素将使用数字”),我自己找不到解决方案。
提前致谢!
您可以使用程序包 plyr
中的函数 mapvalues
。示例:
library(plyr)
# data
data <- data.frame("ID" = 1:5, "text" = c("FACE_WITH_TEARS", "FACE_WITH_JOY",
"FACE_WITH_JOY", "FACE_WITH_PLAIN", "FACE_WITH_TEARS"))
# "dictionary"
emojis <- data.frame("name" = c("FACE_WITH_TEARS", "FACE_WITH_JOY", "FACE_WITH_PLAIN"),
"emojis" = c("CRY", "HAPPY", "NUETRAL"))
data$text <- mapvalues(data$text, emojis$name, emojis$emojis)
data
结果是
ID text
1 1 CRY
2 2 HAPPY
3 3 HAPPY
4 4 NUETRAL
5 5 CRY
您还可以使用 stringr::str_replace_all
和 setNames
从您的 emojis
数据框创建字典:
data <- structure(list(text = c("blabla HUGGING_FACE PARTY_POPPER", "bla FACE_WITH_TEARS_OF_JOY bla FACE_WITH_TEARS_OF_JOY", "PARTY_POPPER")), class = "data.frame", row.names = c(NA, -3L))
emojis <- structure(list(name = c("FACE_WITH_TEARS_OF_JOY", "HUGGING_FACE",
"PARTY_POPPER"), emoji = c("\U0001f602", "\U0001f917", "\U0001f389"
)), class = "data.frame", row.names = c(NA, -3L))
library(stringr)
stringr::str_replace_all(data$text, setNames(emojis$emoji, emojis$name))
输出:
[1] "blabla " "bla bla " ""
1) gsubfn 创建一个字典,dict
,包含一个列表,其名称是要替换的名称,其值是要替换它们的值。然后使用 gsubfn
执行非空格字符串的替换,"\S+"
,使用字典。 gsubfn
采用与 gsub
相同的参数,除了第二个参数可以是这样的列表(或某些其他对象)。
library(gsubfn)
dict <- with(emojis, setNames(as.list(emoji), name))
gsubfn("\S+", dict, data$text)
## [1] "blabla " "bla bla " ""
2) Base R 这使用 Reduce
遍历 emojis
的行,逐行替换它们。
gsub_ <- function(s, i) with(emojis[i, ], gsub(name, emoji, s))
Reduce(gsub_, init = data$text, 1:nrow(emojis))
## [1] "blabla " "bla bla " ""
我有一个包含字符串 (data$text) 的数据集,其中包含表情符号的名称而不是实际图像(例如,FACE_WITH_TEARS_OF_JOY
)。现在我试图用实际的表情符号替换每个表情符号名称。名称和表情符号保存在一个额外的数据集中,该数据集用作“字典”(emojis$name
和 emojis$emoji
)。
所以这是我的数据集:
data <- structure(list(text = c("blabla HUGGING_FACE PARTY_POPPER", "bla FACE_WITH_TEARS_OF_JOY bla FACE_WITH_TEARS_OF_JOY", "PARTY_POPPER")), class = "data.frame", row.names = c(NA, -3L))
看起来像:
text
1 blabla HUGGING_FACE PARTY_POPPER
2 bla FACE_WITH_TEARS_OF_JOY bla FACE_WITH_TEARS_OF_JOY
3 PARTY_POPPER
请注意,表情符号名称只是文本的一部分。其余文字应保留。
这是我的“字典”:
emojis <- structure(list(name = c("FACE_WITH_TEARS_OF_JOY", "HUGGING_FACE",
"PARTY_POPPER"), emoji = c("\U0001f602", "\U0001f917", "\U0001f389"
)), class = "data.frame", row.names = c(NA, -3L))
看起来像:
name emoji
1 FACE_WITH_TEARS_OF_JOY \U0001f602
2 HUGGING_FACE \U0001f917
3 PARTY_POPPER \U0001f389
对于单个表情符号,此代码有效:
data$text <- gsub("FACE_WITH_TEARS_OF_JOY", "\U0001f602", data$text)
结果是:
text
1 blabla HUGGING_FACE PARTY_POPPER
2 bla \U0001f602 bla \U0001f602
3 PARTY_POPPER
但是,我也想替换其他表情符号名称。结果应该是:
text
1 blabla \U0001f917 \U0001f389
2 bla \U0001f602 bla \U0001f602
3 \U0001f389
由于有成千上万的表情符号,我需要这样的东西:
data$text <- gsub(emojis$name, emojis$emoji, data$text)
这不起作用(错误:“参数 'pattern' 的长度 > 1,并且只有第一个元素将使用数字”),我自己找不到解决方案。
提前致谢!
您可以使用程序包 plyr
中的函数 mapvalues
。示例:
library(plyr)
# data
data <- data.frame("ID" = 1:5, "text" = c("FACE_WITH_TEARS", "FACE_WITH_JOY",
"FACE_WITH_JOY", "FACE_WITH_PLAIN", "FACE_WITH_TEARS"))
# "dictionary"
emojis <- data.frame("name" = c("FACE_WITH_TEARS", "FACE_WITH_JOY", "FACE_WITH_PLAIN"),
"emojis" = c("CRY", "HAPPY", "NUETRAL"))
data$text <- mapvalues(data$text, emojis$name, emojis$emojis)
data
结果是
ID text
1 1 CRY
2 2 HAPPY
3 3 HAPPY
4 4 NUETRAL
5 5 CRY
您还可以使用 stringr::str_replace_all
和 setNames
从您的 emojis
数据框创建字典:
data <- structure(list(text = c("blabla HUGGING_FACE PARTY_POPPER", "bla FACE_WITH_TEARS_OF_JOY bla FACE_WITH_TEARS_OF_JOY", "PARTY_POPPER")), class = "data.frame", row.names = c(NA, -3L))
emojis <- structure(list(name = c("FACE_WITH_TEARS_OF_JOY", "HUGGING_FACE",
"PARTY_POPPER"), emoji = c("\U0001f602", "\U0001f917", "\U0001f389"
)), class = "data.frame", row.names = c(NA, -3L))
library(stringr)
stringr::str_replace_all(data$text, setNames(emojis$emoji, emojis$name))
输出:
[1] "blabla " "bla bla " ""
1) gsubfn 创建一个字典,dict
,包含一个列表,其名称是要替换的名称,其值是要替换它们的值。然后使用 gsubfn
执行非空格字符串的替换,"\S+"
,使用字典。 gsubfn
采用与 gsub
相同的参数,除了第二个参数可以是这样的列表(或某些其他对象)。
library(gsubfn)
dict <- with(emojis, setNames(as.list(emoji), name))
gsubfn("\S+", dict, data$text)
## [1] "blabla " "bla bla " ""
2) Base R 这使用 Reduce
遍历 emojis
的行,逐行替换它们。
gsub_ <- function(s, i) with(emojis[i, ], gsub(name, emoji, s))
Reduce(gsub_, init = data$text, 1:nrow(emojis))
## [1] "blabla " "bla bla " ""