R эквивалентный string.replace () в Python - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно заменить некоторые значения символьного вектора:

x <- data.frame(Strings = c("one", "two","three","four","five","four","five","four","five","two","thre","two","three","two","three"), stringsAsFactors = FALSE)
> x
   Strings
1      one
2      two
3    three
4     four
5     five
6     four
7     five
8     four
9     five
10     two
11   three
12     two
13   three
14     two
15   three

В Python я бы сделал:

x["Strings"].replace(["one", "two", "thre","three"], ["One","Two","Three","Three"], inplace=True)

Но в r функция replace() не выполняетработать так же легко.В Stackoverflow есть множество решений для замены строк, но ни у кого нет такой простоты.Это возможно в г?

Ответы [ 6 ]

0 голосов
/ 20 февраля 2019

Вот опция, использующая recode.Создайте список пар ключ / вал, а затем используйте recode, чтобы сопоставить значения в «строках» с «ключом» list и заменить его соответствующим значением

library(tidyverse)
lst1 <- list(one = "One", two = "Two", three = "Three", four = "Four", five = "Five")
x %>% 
   mutate(Strings  = recode(Strings, !!! lst1))

ПРИМЕЧАНИЕ.: Если предположить, что верблюд - это совпадение

0 голосов
/ 20 февраля 2019
x <- data.frame(Strings = c("one", "two","three","four","five","four","five","four","five","two","thre","two","three","two","three"), stringsAsFactors = FALSE)
y=c("one", "two", "thre","three")
z=c("One","Two","Three","Three")


x$Strings=x%>%rowwise()%>%mutate(Strings=if_else(!is.na(z[match(Strings,y)]),
                                                  z[match(Strings,y)],false=Strings))

Используя dplyr(), вам нужно всего лишь изменить y и z.

0 голосов
/ 20 февраля 2019

Синтаксическое решение, близкое к вашему коду Python (с использованием пакета plyr):

x$Strings <- plyr::mapvalues(x$Strings, 
                c("one", "two", "thre","three"),
                c("One","Two","Three","Three")
)
0 голосов
/ 20 февраля 2019

Один из способов - просто преобразовать их в факторы и затем заменить уровни

> x <- data.frame(Strings = c("one", "two","three","four","five","four","five","four","five","two","thre","two","three","two","three"), stringsAsFactors = FALSE)
> x$Strings <- as.factor(x$Strings)
> levels(x$Strings) <- c("Five", "Four", "One", "Three", "Three", "Two")
> x
   Strings
1      One
2      Two
3    Three
4     Four
5     Five
6     Four
7     Five
8     Four
9     Five
10     Two
11   Three
12     Two
13   Three
14     Two
15   Three
0 голосов
/ 20 февраля 2019

Если все, что вы хотели сделать - это набрать первую букву в каждом слове заглавными буквами, мы можем использовать sub:

x$new <- sub('^([a-z])', '\\U\\1', x$Strings, perl = TRUE)

Вывод:

   Strings   new
1      one   One
2      two   Two
3    three Three
4     four  Four
5     five  Five
6     four  Four
7     five  Five
8     four  Four
9     five  Five
10     two   Two
11    thre  Thre
12     two   Two
13   three Three
14     two   Two
15   three Three

Если уже есть список старых и новых слов для замены, мы можем использовать str_replace_all, который имеет (своего рода) стиль, аналогичный описанному в примере с Python: OP:

library(stringr)

pattern <- c("one", "two", "thre", "three")
replacements <- c("One", "Two", "Three", "Three")

named_vec <- setNames(replacements, paste0("\\b", pattern, "\\b"))

x$new <- str_replace_all(x$Strings, named_vec)

или с match или hashmap:

library(dplyr)

x$new <- coalesce(replacements[match(x$Strings, pattern)], x$new)


library(hashmap)

hash_lookup = hashmap(pattern, replacements)
x$new <- coalesce(hash_lookup[[x$Strings]], x$new)

Вывод:

   Strings   new
1      one   One
2      two   Two
3    three Three
4     four  four
5     five  five
6     four  four
7     five  five
8     four  four
9     five  five
10     two   Two
11    thre Three
12     two   Two
13   three Three
14     two   Two
15   three Three
0 голосов
/ 20 февраля 2019

Если вы собираетесь использовать заглавные буквы, пакет Hmisc с capitalize() будет работать.Приношу свои извинения, если я неправильно понял вопрос.

library(Hmisc)

x <- data.frame(Strings = c("one", "two","three","four","five","four","five","four","five","two","thre","two","three","two","three"), stringsAsFactors = FALSE)

x<-sub("thre[^[:space:]]*", "Three", x$Strings)

xCap<-capitalize(x)

as.data.frame(xCap)
    xCap
1    One
2    Two
3  Three
4   Four
5   Five
6   Four
7   Five
8   Four
9   Five
10   Two
11 Three
12   Two
13 Three
14   Two
15 Three

Спасибо @RuiBarradas в комментариях к исправлению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...