De functie as.numeric leest een string als getal, maar alleen als die string ook alleen een getal bevat. Jouw strings bevatten een letter en een cijfer. Er zijn allerlei oplossingen (je kunt bijvoorbeeld recode gebruiken uit het car package), maar de makkelijkste is denk ik de volgende:
- Kijk alleen naar het laatste karakter met substr ('substring')
- Gebruik daar dan as.numeric op
Dit kan bijvoorbeeld zo:
dat\$intention_item1 <- as.numeric(substr(dat\$Intentions1, 2, 2);
Veiligheidshalve kun je eerst eventuele spaties voor of achter de answer code strippen met trim:
dat\$intention_item1 <- as.numeric(substr(trim(dat\$Intentions1), 2, 2);
Hiervoor moet je dan eerst package userfriendlyscience geladen hebben: daar zit die functie trim in.
Je kunt dit ook voor meerdere tegelijk doen:
varsToRecode <- c('Intentions1', 'Intentions2', 'Intentions3');
newVarNames <- paste0(varsToRecode, '_recoded');
dat[, newVarNames] <- lapply(dat[, varsToRecode], function(currentVar) {
return(as.numeric(substr(trim(currentVar), 2, 2));
});
De functie lapply pakt een lijst met objecten (of een dataframe met kolommen) en geeft die objecten (of kolommen) dan een voor een door aan een functie. De resultaten worden dan weer teruggegeven.