Замена всей строки наблюдения / символа, если она содержит определенные символы - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь подсчитать количество провайдеров, предлагающих конкретный курс, в соответствии с уровнями CEFR (Общеевропейские рамки для языков), которых должно быть 6 ( A1, A2, B1, B2,C1, C2 )

База данных была составлена ​​многими разными людьми, поэтому текстовые вводы не все одинаковы.Это означает, что вместо 6 факторов у меня было 61.

Я попытался изменить класс фрейма данных таким образом, чтобы все наблюдения были символами, а затем заменить наблюдения, содержащие целевое выражение и лишние символы (в данном случае «A1»)с целевым выражением и без пробелов.

Я использую пакет stringr .

str_replace_all(ilepString$Entry.Level, "A1", "NA_Character_")
str_replace_all(ilepString$Entry.Level, "NA", "A1")
str_trim(ilepString$Entry.Level)
str_detect(ilepString$Entry.Level, "A1") #This shows me that I have failed, quite miserably, as character strings containing solely "A1" are in data obs., but entries of "A1" along with other unwanted characters, or blank space, still persist in the dataset.

Я также попробовал следующее:

gsub (". A0. "," A1 ", ilepString $ Entry.Level)

Однако, когда я спрашиваю, как теперь выглядят данные с

  dput(head(ilepString$Entry.Level))

c("", "A1", "A1", "A2", "B1", "B2")
#Looking at the head, the output seems fine, but the following command shows the problem remains:

    ilepString$Entry.Level[351:369] 
[351] "A1-B1"                    "A2"                      
[353] "B1"                       "A2-B2"                   
[355] "4.5 A2"                   "B1"                      
[357] "B2"                       "A1-A2"                   
[359] "A2-B1"                    "A2-B2"                   
[361] "A1"                       "A2"                      
[363] "B1"                       "B2"                      
[365] "A1"                       "A2"                      
[367] "B1"                       "B2"                      
[369] " A1"                      " A2"

, я хочу каждую запись / объект.быть уменьшенным до одной буквы и цифры.

[351] "A1"                       "A2"                      
[353] "B1"                       "A2"                   
[355] "A2"                       "B1"                      
[357] "B2"                       "A1"                   
[359] "A2"                       "A2"  

Приношу свои извинения, если я плохо себя объяснил.Пожалуйста, имейте в виду, что я совсем новичок в R, и на самом деле не очень разбираюсь в этом.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Я не уверен, что именно вы хотите.Но я предполагаю, что вы хотите заменить определенные строковые шаблоны на определенные шаблоны.Например, приведенный ниже код может заменить «A0» на «A1».

Надеюсь, это поможет.

numSample = 4
set.seed(5)
df = data.frame("levelOriginal" = paste0(
  sample(x = c("A","B","C"), size = numSample, replace = TRUE),
  floor(runif(n = numSample, min = 0, max = 3))
), stringsAsFactors = FALSE)

df$levelRevised = df$levelOriginal
df$levelRevised[grepl(pattern = "A0", x = df$levelRevised)] = "A1"

df
# levelOriginal levelRevised
# 1            A0           A1
# 2            C2           C2
# 3            C1           C1
# 4            A2           A2
0 голосов
/ 24 декабря 2018

Вы сталкиваетесь с тем, что gsub и str_replace_all находят шаблон в строке и заменяют шаблон новой строкой в ​​существующей строке.Эти функции, насколько я знаю, не поддерживают замену всей строки.

Пример:

str_replace("Hi my name is Zach", "Zach", "John") 
[1] "Hi my name is John"

Поэтому вместо такой проблемы я бы предложил либо использовать str_detect, чтобы найти, какие наблюдения вам нужно сделать для полной замены, например: (Примечание: этоперезаписывает существующие данные и может быть изменен, чтобы быть новым столбцом вместо этого):

ilepString$Entry.Level[str_detect(ilepString$Entry.Level, "A1")] = "A1"

Или другой подход, который я бы посоветовал изучить для таких проблем, как соответствие строки с stringdist пакет.Функция amatch сопоставляет строку на основе показателя сходства (имеется ряд поддерживаемых метрик для соответствия) с заранее определенным набором.

Пример автора пакета можно найти здесь:

По существу, для вашей проблемы вы бы написалиСкажем так:

amatch(ilepString$Entry.Level, c('A1','A2','B1','B2','C1','C2')...other inputs...)

Надеюсь, это поможет и удачи!

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