Заменить юникод его значением в кадре данных - PullRequest
0 голосов
/ 27 июня 2019

Я пытался заменить юникод "U + 00F3" из фрейма данных функцией sapply, но ничего не произошло. Часть Unicode, которую я хочу заменить, имеет тип chr.

Здесь функция:

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

РЕДАКТИРОВАТЬ:

Благодаря ответу Кэт ниже, я добавил перед +: \\

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")

1 Ответ

2 голосов
/ 27 июня 2019

Я не могу повторить проблему с 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

Однако замена с использованием регулярных выражений может оказаться не самым эффективным способом преобразования символов Юникода, поскольку для этого потребуется несколько вызовов gsub. Вместо этого вы можете попробовать stri_unescape_unicode() для stringi:

# 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

Формат <U+0000> сначала преобразуется в \\u0000 с использованием gsub, а затем не экранируется. Как видите, он обрабатывает сразу несколько символов Юникода, что значительно упрощает процесс.

Данные:

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...