【问题标题】:Replace unicode by its value in a dataframe用数据框中的值替换 unicode
【发布时间】:2019-06-27 06:31:50
【问题描述】:

我尝试用 sapply 函数替换数据帧中的 unicode“U+00F3”,但什么也没发生。我要替换的 unicode 部分是 chr 类型。

这里是函数:

tableExcel$Team <- sapply(tableExcel$Team, gsub, pattern = "<U+00F3>", replacement= "o")

编辑:

感谢下面Cath的回答,我在+之前添加了:\\

tableExcel$Team <- sapply(tableExcel$Team, gsub, pattern = "<U\\+00F3>", replacement= "o")

但是没有用。

我也尝试提供我的数据集的示例,但问题是它适用于它而不是我的:

tableExcel <- data.frame("Team" = c("A", "B", "C", "Reducci<U+00F3>n"), "Point" = c(2, 30, 40, 30))
tableExcel$Team <- as.character(tableExcel$Team)   

为了提供更多信息,这里输入我的excel文件:

tableExcel <- as.data.frame(read_excel("Dataset LOS.xls", sheet = "Liga Squads"))

我的数据结构:

structure(list(Team = c("CHURN", "CHURN", "RESIDENCIAL NPTB", "RESIDENCIAL NPTB", "AUDIENCIAS TV", "AUDIENCIAS TV"), Points = c("P. Asig", "P. entr", "P. Asig", "P. entr", "P. Asig", "P. entr"), 2019-S01 = c(0, 0, 50, 0, NA, NA), 2019-S02 = c(0, 0, 10, 10, NA, NA), 2019-S03 = c(93, 88, 46, 19, NA, NA), 2019-S04 = c(56, 48, 0, 0, 13, 13), 2019-S05 = c(NA, NA, 80.5, 49.5, 42, 28.5), 2019-S06 = c(NA, NA, 66, 48, 55, 39.5), 2019-S07 = c(131, 112, 103, 63, 40.5, 38)), row.names = c(1L, 2L, 4L, 5L, 7L, 8L), class = "data.frame")

【问题讨论】:

  • 您需要为gsub 添加fixed=TRUE 或转义特殊字符("&lt;U\\+00F3&gt;" 而不是"&lt;U+00F3&gt;"),因为+ 表示“一次或多次” 在正则表达式而不是 jsut "+" 中,请参阅 ?regex
  • 我试过这样但没用:tableExcel$Team &lt;- gsub("&lt;U\\+00F3&gt;", "o", tableExcel$Team,fixed = TRUE)
  • 转义或输入fixed=TRUE:您的行正在搜索“
  • 它没有用。也许是因为 ?
  • 那么我们需要更多信息...因为gsub("&lt;U\\+00F3&gt;", "o", "aaa&lt;U+00F3&gt;") 提供了[1] "aaao" 预期。 (不需要转义)

标签: r unicode shiny


【解决方案1】:

我无法用gsub 复制该问题。以下按预期工作:

tableExcel$Team <- gsub("<U\\+00F3>", "o", tableExcel$Team)

#### OUTPUT ####

              Team  Points 2019-S01 2019-S02 2019-S03 2019-S04 2019-S05 2019-S06 2019-S07
1 Reducci<U+00F1>n P. Asig        0        0       93       56       NA       NA    131.0
2            CHURN P. entr        0        0       88       48       NA       NA    112.0
4 Reducci<U+00F2>n P. Asig       50       10       46        0     80.5     66.0    103.0
5 RESIDENCIAL NPTB P. entr        0       10       19        0     49.5     48.0     63.0
7    AUDIENCIAS TV P. Asig       NA       NA       NA       13     42.0     55.0     40.5
8             <NA> P. entr       NA       NA       NA       13     28.5     39.5     38.0
9        Reduccion P. entr       NA       NA       NA       NA       NA       NA       NA

但是,使用正则表达式替换可能不是转换 unicode 字符的最有效方法,因为这需要多次调用 gsub。相反,您可能想试试 stringi 的 stri_unescape_unicode()

# install.packages("stringi") # Use if not yet installed.
library(stringi)

tableExcel$Team <- stri_unescape_unicode(gsub("<U\\+(.*)>", "\\\\u\\1", tableExcel$Team))

#### OUTPUT ####

              Team  Points 2019-S01 2019-S02 2019-S03 2019-S04 2019-S05 2019-S06 2019-S07
1        Reducciñn P. Asig        0        0       93       56       NA       NA    131.0
2            CHURN P. entr        0        0       88       48       NA       NA    112.0
4        Reducciòn P. Asig       50       10       46        0     80.5     66.0    103.0
5 RESIDENCIAL NPTB P. entr        0       10       19        0     49.5     48.0     63.0
7    AUDIENCIAS TV P. Asig       NA       NA       NA       13     42.0     55.0     40.5
8             <NA> P. entr       NA       NA       NA       13     28.5     39.5     38.0
9        Reducción P. entr       NA       NA       NA       NA       NA       NA       NA

&lt;U+0000&gt; 格式首先使用gsub 转换为\\u0000,然后转义。如您所见,它一次性处理多个 unicode 字符,这让事情变得更加简单。

数据:

tableExcel <- structure(list(Team = c("Reducci<U+00F1>n", "CHURN", "Reducci<U+00F2>n", 
"RESIDENCIAL NPTB", "AUDIENCIAS TV", NA, "Reducci<U+00F3>n"), 
    Points = c("P. Asig", "P. entr", "P. Asig", "P. entr", "P. Asig", 
    "P. entr", "P. entr"), `2019-S01` = c(0, 0, 50, 0, NA, NA, 
    NA), `2019-S02` = c(0, 0, 10, 10, NA, NA, NA), `2019-S03` = c(93, 
    88, 46, 19, NA, NA, NA), `2019-S04` = c(56, 48, 0, 0, 13, 
    13, NA), `2019-S05` = c(NA, NA, 80.5, 49.5, 42, 28.5, NA), 
    `2019-S06` = c(NA, NA, 66, 48, 55, 39.5, NA), `2019-S07` = c(131, 
    112, 103, 63, 40.5, 38, NA)), row.names = c(1L, 2L, 4L, 5L, 
7L, 8L, 9L), class = "data.frame")

【讨论】:

  • 感谢您的帮助!我拿走了你的代码,但它对我的数据集没有做任何事情..
  • 好吧 看来 R cloud 运行的不是很好,这是第二次没有考虑到我在做什么。无论如何,现在它可以工作了,谢谢!
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2022-01-11
  • 2014-11-12
  • 2014-12-15
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多