Удалите записи, начинающиеся с символа (Vxxx), чтобы включить команду floor() в R.

Я работаю с кодовыми данными отделения неотложной помощи МКБ-9 (диагнозы здоровья), которые представляют собой трехзначные коды с двумя десятичными знаками после (примеры: 499, 499.1, 499.51 и т. д.). Некоторые специальные коды имеют букву «V» вместо первой цифры, например «V10.46».

Каждое посещение отделения неотложной помощи (строка) может иметь до 11 кодов диагнозов (столбцов), поэтому я использовал reshape(), чтобы изменить набор данных на длинный формат. Теперь я хочу использовать floor() для удаления этих десятичных точек. Но R не может пустить что-то с характером! Я получаю эту ошибку: Ошибка в Math.factor(dtl$diag): пол не имеет значения для факторов

Этот пост имел некоторое отношение, но мне интересно, есть ли лучший способ? R: удалить наблюдения за символами в переменной

Любые идеи?


person mEvans    schedule 18.02.2012    source источник


Ответы (3)


Основываясь на превосходном ответе @Vincent Zoonekynd, если целью было использование floor для данных, вы можете просто удалить «V» и вызвать floor для остальных:

x <- c("499", "499.1", "499.51", "V10.46")
# replace all occurences of "V" with nothing ("") in x:
x.stripped <- gsub("V", "", x) 
# convert to numeric so we can use floor():
x.floor <- floor(as.numeric(x.stripped))

Судя по вашему сообщению об ошибке «не имеет значения для факторов», этот столбец ваших данных был прочитан как строки (из-за «V» в некоторых строках), а поведение R по умолчанию заключается в преобразовании строковых столбцов в факторы (например, категории).

Если вы получаете сообщение об ошибке о том, что gsub не работает с факторами, вам нужно сначала преобразовать столбец в строки:

mydf$columname <- as.character(mydf$columnname)

И тогда вы можете действовать, как и раньше.

person mathematical.coffee    schedule 19.02.2012
comment
Привет математический.кофе. Мне нравится эта идея, но проблема в том, что если убрать букву V и пол, то код станет неотличим от ранее существовавших двузначных кодов с одним и тем же номером. (Например, V10.46 станет таким же, как все коды 10.x, которые все станут 10). Я попытался заменить V на 0, но это все равно объединяется с существующими кодами. Можете ли вы заменить V несколькими цифрами? - person mEvans; 19.02.2012
comment
Хм, если вы хотите сохранить предыдущий V, используйте ответ @VincentZoonekynd. - person mathematical.coffee; 19.02.2012
comment
Я заменил V на 919 — он достаточно отличается от любого из кодов, но все же соответствует требованиям числового формата! - person mEvans; 24.02.2012

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

x <- c("499", "499.1", "499.51", "V10.46")
gsub("\\..*", "", x)
# Output:
# [1] "499" "499" "499" "V10"
person Vincent Zoonekynd    schedule 18.02.2012
comment
Я новичок - к чему относится \\..*? и ? - person mEvans; 19.02.2012
comment
Это регулярное выражение — оно означает замену литерала. (что означает «\.» в регулярном выражении, а обратную косую черту необходимо экранировать в R, следовательно, «\\.»), за которым следует что-либо (.*) и ничего (""). Таким образом, он удаляет все после и включая десятичную точку, которая имитирует floor. Хотя я думаю, что вы также хотели раздеть первого V, верно? Посмотрите на ?gsub и посмотрите, можете ли вы сделать что-то подобное, чтобы удалить V (это будет проще, чем gsub в этом ответе). Затем вы можете использовать as.numeric для преобразования строк в числа. - person mathematical.coffee; 19.02.2012
comment
Можно ли использовать это выражение gsub при вызове определенного столбца? В вашем примере, если бы я хотел сделать это со значениями в столбце 4, я бы сделал это: gsub(\\..*, , x$4)? - person mEvans; 19.02.2012
comment
почти: x[[4]] <- gsub("\\..*","",x[[4]]) - person Ben Bolker; 19.02.2012
comment
Хорошо, но это назначает столбец 4 - я хочу ЗАМЕНИТЬ все значения в столбце 4 новыми значениями, которые не имеют десятичных знаков. Интересующий меня столбец называется diag. Вот моя попытка: dtlong$diag = gsub(\\..*, , dtlong$diag)? Благодарность! - person mEvans; 19.02.2012

Для первых трех букв вы можете использовать функцию подстроки.

icd9 <- factor(c("499", "499.1", "499.51", "V10.46"))
substr(as.character(icd9),1,3)# as.character is used 
                              # because icd9 is factor in your data

Вывод

[1] "499" "499" "499" "V10"
person Wojciech Sobala    schedule 19.02.2012