2016-02-22 2 views
0

У меня есть dataframe, который имеет 6 переменных и один из них выглядит следующим образом:перекодировка переменных в R

a_title 

2 LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),2m,opal,2 Stucke,4 Stucke] 
3 LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),1m,opal,ohne,2 Stucke] 

Как вы можете видеть название долго и запутанной. Важными данными этой длинной строки являются «Typ-3» и «1m или 2m».

Моя цель будет перекодировать эту длинную строку в нечто вроде этого -> «Typ-3 2м»

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

data$a_title[data$a_title=="Typ-1" | ",1m,"] <- "Typ-1 1m" 
+0

ли струны всегда структурированы подобным? – Heroka

+0

Я бы рекомендовал регулярное выражение с gsub –

+0

Строки всегда структурированы аналогично ... это dataframe, который я вытащил из API ebay. –

ответ

3

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

dat$typ <- gsub(".+(Typ-[0-9]+).+),([0-9]+m),.+","\\1 \\2",dat$a_title) 
0

Вы можете использовать команду recode из car пакета. Вот пример. Сначала я генерировать вектор с категориями вы упомянули:

x <- c(rep("LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),2m,opal,2 Stucke,4 Stucke]",3), 
rep("LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),1m,opal,ohne,2 Stucke]",2)) 

Этот вектор выглядит следующим образом:

> x 
[1] "LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),2m,opal,2 Stucke,4 Stucke]" 
[2] "LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),2m,opal,2 Stucke,4 Stucke]" 
[3] "LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),2m,opal,2 Stucke,4 Stucke]" 
[4] "LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),1m,opal,ohne,2 Stucke]"  
[5] "LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),1m,opal,ohne,2 Stucke]"  

Теперь я могу перекодировать этот вектор (убедитесь, что все ' и " находятся в нужном месте):

library(car) 
y <- recode(x, "'LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),2m,opal,2 Stucke,4 Stucke]'='Typ1'; 
'LED Aluprofil 1m 2m fur LED Streifen Abdeckung ALU[Typ-3 (16121),1m,opal,ohne,2 Stucke]'='Typ2'") 

Проверьте, если он работал:

> y 
[1] "Typ1" "Typ1" "Typ1" "Typ2" "Typ2" 

Или превратить в фактор:

> as.factor(y) 
[1] Typ1 Typ1 Typ1 Typ2 Typ2 
Levels: Typ1 Typ2 
+1

Я не уверен, что это только две уникальные строки, с которыми мы имеем дело, выглядит как какой-то инвентарь. – Heroka

0

Это также будет работать

matches = sapply(c("Typ-\\d", "\\dm"), function(x) regmatches(a, regexpr(x, a))) 
paste(matches, collapse=" ") 

хотя я нахожу ответ Heroka наиболее элегантный до сих пор;)

Смежные вопросы