首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中“字典”数据的多个模式和替换,可能是用gsub?

R中“字典”数据的多个模式和替换,可能是用gsub?
EN

Stack Overflow用户
提问于 2021-11-13 16:05:12
回答 3查看 129关注 0票数 1

我有一个包含字符串(数据$text)的数据集,其中包含表情符号的名称,而不是实际的图像(例如,FACE_WITH_TEARS_OF_JOY)。现在,我试图用实际的表情符号替换每个表情符号的名字。名称和表情符号保存在一个额外的数据集中,作为“字典”(emojis$nameemojis$emoji)。

这是我的数据集:

代码语言:javascript
复制
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))

看上去像:

代码语言:javascript
复制
                                                   text
1                      blabla HUGGING_FACE PARTY_POPPER
2 bla FACE_WITH_TEARS_OF_JOY bla FACE_WITH_TEARS_OF_JOY
3                                          PARTY_POPPER

请注意,表情符号名称只是文本的一部分。其余的案文应保留。

这是我的“字典”

代码语言:javascript
复制
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))

看上去像:

代码语言:javascript
复制
                    name      emoji
1 FACE_WITH_TEARS_OF_JOY \U0001f602
2           HUGGING_FACE \U0001f917
3           PARTY_POPPER \U0001f389

对于单个表情符号,此代码工作如下:

代码语言:javascript
复制
data$text <- gsub("FACE_WITH_TEARS_OF_JOY", "\U0001f602", data$text)

结果是:

代码语言:javascript
复制
                              text
1 blabla HUGGING_FACE PARTY_POPPER
2    bla \U0001f602 bla \U0001f602
3                     PARTY_POPPER

然而,我也想替换其他的表情符号名称。其结果应该是:

代码语言:javascript
复制
                           text
1  blabla \U0001f917 \U0001f389
2 bla \U0001f602 bla \U0001f602
3                    \U0001f389

因为有成千上万的表情符号,我需要这样的东西:

代码语言:javascript
复制
data$text <- gsub(emojis$name, emojis$emoji, data$text)

这不起作用(错误:“参数‘模式’的长度>1,只有第一个元素将被使用数值"),我自己也找不到解决方案。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-14 18:09:06

1) gsubfn创建了一个名为dict的字典,它由一个列表组成,其名称是要替换的名称,其值是要替换它们的值。然后使用gsubfn执行非空格字符串"\\S+"的替换,使用字典。gsubfn使用与gsub相同的参数,除了第二个参数可以是这样的列表(或某些其他对象)。

代码语言:javascript
复制
library(gsubfn)

dict <- with(emojis, setNames(as.list(emoji), name))
gsubfn("\\S+", dict, data$text)
## [1] "blabla  "  "bla  bla " ""   

2) Base --它使用Reduce来迭代emojis的行,逐个替换它们。

代码语言:javascript
复制
gsub_ <- function(s, i) with(emojis[i, ], gsub(name, emoji, s))
Reduce(gsub_, init = data$text, 1:nrow(emojis))
## [1] "blabla  "  "bla  bla " ""       
票数 0
EN

Stack Overflow用户

发布于 2021-11-13 16:51:13

您可以在包mapvalues中使用函数plyr。示例:

代码语言:javascript
复制
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

结果是

代码语言:javascript
复制
  ID    text
1  1     CRY
2  2   HAPPY
3  3   HAPPY
4  4 NUETRAL
5  5     CRY
票数 0
EN

Stack Overflow用户

发布于 2021-11-13 18:30:26

您还可以使用stringr::str_replace_allsetNames创建一个字典,使用您的emojis数据文件:

代码语言:javascript
复制
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))

在线R演示

输出:

代码语言:javascript
复制
[1] "blabla  "  "bla  bla " "" 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69955975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档