2013-09-20 5 views
1

У меня есть вектор, который является ответом на вопрос «Пожалуйста, укажите свой возраст».Преобразование строки ответа на номер.

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

Некоторые ответы «32»; "32 года"; «32 años»; «Около 70 лет»; «старый, очень старый ......... середина сороковые»; «к 7 октября 2013 года, я 31yo»; «Восемнадцать лет возраста»; и т. д. и т. д.

Есть ли способ конвертировать как можно больше этих данных в числа, а остальные - в НС? (Делать это вручную не желательно, потому что есть тысячи наблюдений)

Спасибо!

+1

Я не думаю, что есть способ сделать это, что обеспечит любую надежность. То есть, подумайте о числе, как о другом символе в море текста альманаха. – sln

ответ

2

Используйте это:

L <- lapply(regmatches(s, gregexpr("[0-9\\.]+",s)), as.numeric) 

Результат (s <- "by 7th october 2013, i'm 31yo"):

# [[1]] 
# [1] 7 2013 31 

Чтобы вернуться числовой вектор с NA, где список L выше имеет более одного номера, используйте:

result <- rep(NA, length(L)) 
ok <- sapply(L, length)==1 
result[ok] <- unlist(L[ok]) 

BTW: Вы также можете удалить "\". в регулярном выражении выше, чтобы избежать не целочисленных результатов.

+0

(+1) Используя примеры OP: 'example <- c (« 32 »,« 32 года »,« 32 años »,« Около 70 лет »,« старый »,« очень старый », сорок "," к 7 октября 2013 года, я 31yo "," 18 лет возраста "), as.numeric (gsub (" [^ 0-9 \\.] "," ", пример))' дает странный результат. OP всегда может отфильтровывать значения, превышающие 100. – dayne

+0

@dayne, вы правы, я изменил ответ, чтобы быть более общим. –

+0

Как я могу получить числовой вектор вместо списка. Я попробовал unlist, но я получил ошибку «замена имеет 4100 строк, данные 4101» – Ignacio

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