【问题标题】:Use gsub to replace list of expressions使用 gsub 替换表达式列表
【发布时间】:2021-09-17 22:22:10
【问题描述】:

我有一个 list 的表达式,我想在 data 中替换它们,这是一个 quanteda 语料库。说:

name joined_name
John Doe jimmy_waffles
Jane Doe jane_waffles

我想使用gsub(list$name, list$joined_name, data, ignore.case = TRUE)之类的东西 显然,这是行不通的。有什么更好的方法来做到这一点?

【问题讨论】:

  • list 是什么?你能举个例子吗?
  • Map 最适合用于迭代成对的元素列表。 Map(\(x, r) gsub(x, r, ignore.case = T), list$name, list$joined_name).

标签: r dataframe gsub


【解决方案1】:

我们可以使用str_replace 代替gsub,因为gsub 未针对patterns 进行矢量化

library(stringr)
str_replace_all(data, regex(list$name ignore_case = TRUE), list$joined_name)

注意:假设data 是字符串的vector


使用gsub/sub,我们可能需要循环

for(i in seq_along(list$name)) {
     data <- gsub(list$name[i], list$joined_name[i], data, ignore.case = TRUE)
}

【讨论】:

  • 我认为您的意思是str_replace_all(data, regex(list$name, ignore_case = TRUE), list$joined_name),否则它对我来说看起来不错。 data 是一个 quanteda 语料库对象,因此是一个字符串向量。尽管如此,运行代码给了我一个警告:“更长的对象长度不是更短的对象长度的倍数”。
  • for 循环返回“参数 'replacement' 的长度 > 1,并且只使用第一个元素”
  • @ab0rt 抱歉,有错字。 list$joined_name 将是 list$joined_name[i]
【解决方案2】:

使用match

x <- c("john_doe", "john_doe", "jane_doe", "john_doe", "john_doe")

d[match(x, d$joined_name), 1]
# [1] "John Doe" "John Doe" "Jane Doe" "John Doe" "John Doe"

数据

d <- structure(list(name = c("John Doe", "Jane Doe"), joined_name = c("john_doe", 
"jane_doe")), class = "data.frame", row.names = c(NA, -2L))

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多