R: заменить все значения, которые не равны набору значений - PullRequest
0 голосов
/ 23 марта 2020

Все.

Я пытался решить проблему с большим набором данных в течение некоторого времени и мог бы использовать вашу мудрость.

У меня есть DF (1,3M obs) со столбцом под названием customer вместе с 30 другими столбцами. Допустим, он содержит несколько экземпляров клиентов с Customer1 по Customer3000. Я знаю, что у меня проблемы с 30 из этих клиентов. Мне нужно найти всех клиентов, которые НЕ являются клиентами, с которыми у меня возникли проблемы, и заменить значение в столбце «клиент» текстом «Поддерживаемый клиент». Кажется, что это должно быть просто ... если бы не было количества obs, я бы загрузил его в Excel, отфильтровал всех плохих клиентов и скопировал / вставил текст «Поддерживаемый клиент» поверх того, что осталось.

Я попытался заменить и str_replace_all, используя grepl и paste / paste0, но безрезультатно. мой текущий код выглядит так:

    #All the customers that have issues
    out <- c("Customer123", "Customer124", "Customer125", "Customer126", "Customer127",  
    "Customer128", ..... , "Customer140")
    #Look for everything that is NOT in the list above and replace with "Enabled"
    orderData$customer <- str_replace_all(orderData$customer, paste0("[^", paste(out, collapse = 
    "|"), "]"), "Enabled Customers")

Этот код вызывает у меня эту ошибку:

    Error in stri_replace_all_regex(string, pattern, fix_replacement(replacement),  : 
    In a character range [x-y], x is greater than y. (U_REGEX_INVALID_RANGE)

Я попробовал обратный подход и вытащил список всех объектов, которые не сопоставьте список наших клиентов. Примерно так:

     in <- orderData %>% filter(!customer %in% out) %>% select(customer) %>% 
     distinct(customer)

Это дает мне гораздо больший список клиентов, которые включены (~ 3100). Однако использование подхода str_replace_all and paste имеет проблемы. При этом большом количестве шаблонов паста больше не сворачивается с помощью «|» оператор. вместо этого я получаю строку, которая выглядит следующим образом:

     "c(\"Customer1\", \"Customer2345\", \"Customer54\", ......)

При передаче в str_replace_all это не соответствует ни одному шаблону.

В любом случае, должен быть более простой способ сделать это. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 23 марта 2020

Вот подход data.table.

Сначала приведем несколько примеров данных, поскольку вы их не предоставили.

customer <- sample(paste0("Customer",1:300),5000,replace = TRUE)
orderData <- data.frame(customer = sample(paste0("Customer",1:300),5000,replace = TRUE),stringsAsFactors = FALSE)
orderData <- cbind(orderData,matrix(runif(0,100,n=5000*30),ncol=30))
out <- c("Customer123", "Customer124", "Customer125", "Customer126", "Customer127",  "Customer128","Customer140")
library(data.table)
setDT(orderData)
result <- orderData[!(customer %in% out),customer := gsub("Customer","Supported Customer ",customer)]
result
                    customer        1        2         3        4         5         6        7        8         9
   1: Supported Customer 134 65.35091  8.57117 79.594166 84.88867 97.225276 84.563997 17.15166 41.87160  3.717705
   2: Supported Customer 225 72.95757 32.80893 27.318046 72.97045 28.698518 60.709381 92.51114 79.90031  7.311200
   3: Supported Customer 222 39.55269 89.51003  1.626846 80.66629  9.983814 87.122153 85.80335 91.36377 14.667535
   4: Supported Customer 184 24.44624 20.64762  9.555844 74.39480 49.189537 73.126275 94.05833 36.34749  3.091072
   5: Supported Customer 194 42.34858 16.08034 34.182737 75.81006 35.167769 23.780069 36.08756 26.46816 31.994756
  ---      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...