R переменная перекодирования — неожиданная НЕЗАВЕРШЕННАЯ СТРОКА

#r #r-car

#r #r-car

Вопрос:

Я пытаюсь перекодировать факторную переменную в R и использую следующий код:

 library(car)
napier_captureComplexity=recode(napier$a_SpatialConnectivity,"'1 - Very simple and clear:     no diagrams, single sheets'=1;'2 - Reasonably simple: some simple diagrams or second sheets'=2;'3 - Reasonably complex: multiple diagrams or sheets but can be followed'=3;'4 - Moderately complex: multiple diagrams and sheets'=4;'5 - Very complex'=5;",as.factor.result=FALSE)
  

И получите следующее сообщение об ошибке:

 Error in parse(text = range[[1]][1]) : <text>:1:1: unexpected INCOMPLETE_STRING 1: '4 - Moderately complex
  

С ^ под номером 4

Я не уверен, что является причиной этого, я задавался вопросом о: через код, но я не использую c(), и код отлично выполняется для других факторов в наборе данных, которые имеют похожие строковые значения в них.

Любая помощь приветствуется!

Ответ №1:

На самом деле это из-за «:» в ваших описаниях. Для работы этой функции используются некоторые нечетные eval strsplit операторы и. В итоге происходит разделение на «:», потому что это специальный код в их синтаксисе, и, похоже, нет способа избежать этого.

Но я предполагаю napier$a_SpatialConnectivity , что это фактор с этими заданными уровнями? Вы можете перекодировать переменную, явно установив уровни в factor() вызове.

 mylevels <- c("1 - Very simple and clear:     no diagrams, single sheets",
  "2 - Reasonably simple: some simple diagrams or second sheets", 
  "3 - Reasonably complex: multiple diagrams or sheets but can be followed", 
  "4 - Moderately complex: multiple diagrams and sheets", 
  "5 - Very complex")

napier_captureComplexity <- as.numeric(factor(napier$a_SpatialConnectivity, levels=mylevels))
  

Это упорядочит уровни 1: 5, которые, как оказалось, были тем, как вы все равно пытались их перекодировать.

Комментарии:

1. Я следовал вашему методу, все значения стали NA … Вы уверены, что ваш метод работает?

2. Да, я уверен. Если вы определяете napier<-data.frame(a_SpatialConnectivity=sample(mylevels, 20, replace=T)) после mylevels определения, код будет выполняться и выдавать числовые значения, а не NA .

3. Я думаю, что в вашем коде что-то не так. если вы используете napier<- , в результате napier будет иметь только один столбец . В моем случае это так adult$salary . Согласно вашему методу mylevels<-c(" <=50K"," >50K") data.frame(salary=sample(mylevels, 938, replace=T)) , этот код генерирует data.frame с 938 строкой, а внутренние данные по-прежнему «<= 50K», » > 50K», а не 1 и 2 , и это не имеет ничего общего с исходными данными adult$salary . Я работал над этим более одного часа.

4. Я не понимаю, что вы делаете. Предоставленный мной ответ не изменяет исходный фрейм данных. Если у вас возникли проблемы, возможно, вам следует открыть свой собственный вопрос и включить воспроизводимый пример. Сложно пытаться ответить на новые вопросы в комментариях.

Ответ №2:

recode кажется, интерпретирует : как представляющий диапазон значений, даже если он находится внутри строки, а : интерпретируется как преждевременное завершение строки. Например:

 x = c("a","b","c")
recode(x, "'a'=1; 'b'=2; 'c'=3;")
[1] 1 2 3
  

но

 x = c("a:d","b","c")
recode(x, "'a:d'=1; 'b'=2; 'c'=3;")
Error in parse(text = range[[1]][1]) : 
  <text>:1:1: unexpected INCOMPLETE_STRING
1: 'a
    ^
  

В каждом примере, который я пробовал, строка заканчивается на : , вызывая ошибку.

Комментарии:

1. Я думаю, это не решение.)

Ответ №3:

Любой, кто находится в аналогичном положении, но работает со строками вместо факторов, должен иметь возможность использовать gsub для удаления двоеточия из данных.

 napier_captureComplexityy <- gsub(":","",napier$a_SpatialConnectivity)
  

Опустите двоеточие в recode строке, и все должно быть готово.