Измените целое число на определенную строку в data.frame

У меня есть фрейм данных с двумя столбцами. Второй столбец содержит только целые числа. Точнее, он содержит 0,1,2,3 и несколько NA. Что-то вроде этого:

id1    0
id2    1
id3    0
id4    2
id5    3
id6    1
id7    2
id8    NA

Я ищу команду, которая меняет 0 на ZZT, 1 на ZZU и так далее. АН должны оставаться АН. Как это могло работать?

Я попробовал цикл for в сочетании с некоторыми операторами if, но это не работает. Я знаю, что такое изменение мышления довольно просто в R, но, похоже, у меня блок в голове.


person Tobias    schedule 02.06.2015    source источник


Ответы (3)


Вы можете отображать значения с помощью функции mapvalues из пакета plyr. Используя пример данных из ответа Майка Уайза:

library(plyr)
df$val2 <- mapvalues(df$val,
                           from = c(0,1,2,3,NA),
                           to = c("ZZT", "ZZU", "ZZV", "ZZW", NA))

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

person Sam Firke    schedule 02.06.2015

Это сделает это:

  # Setup an example data frame
  df <- data.frame(id=c("id1","id2","id3","id4","id5","id6","id7","id8"),
                 val=c(0,1,0,2,3,1,2,NA))

  # Now setup the translation vector - essentially a lookup table
  trans <- c("ZZT","ZZU","ZZV","ZZW",NA)
  names(trans) <- c(0,1,2,3,NA)

  # Now translate the values into a new column and print it out 
  df$nval <- trans[ as.character(df$val) ]
  df$nval
  # [1] "ZZT" "ZZU" "ZZT" "ZZV" "ZZW" "ZZU" "ZZV" NA 

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

Прочитайте замечательную главу Хэдли Уикхэма «Advanced R» о подмножествах, если вы этого не понимаете. http://adv-r.had.co.nz/Subsetting.html

person Mike Wise    schedule 02.06.2015
comment
Или используйте подход factor, т.е. as.character(with(df, factor(val, levels=unique(val), labels=trans[-length(trans)]))) - person akrun; 02.06.2015
comment
Может быть более интуитивно понятно создать транс как c("0"="ZZT","1"="ZZU","2"="ZZV","3"="ZZW"), который работает, потому что ОП хочет сохранить NA как NA. - person Frank; 02.06.2015

Использование match для создания вектора индекса в векторе замещающих значений является «каноническим» подходом R (на примере Майка Уайза)

c("ZZT","ZZU","ZZV","ZZW",NA)[ match( df1$val, c(0,1,2,3,NA))]
[1] "ZZT" "ZZU" "ZZT" "ZZV" "ZZW" "ZZU" "ZZV" NA

Если вы хотите заменить их «на месте» (как правило, опасный вариант), то это может сработать:

df$val <- c("ZZT","ZZU","ZZV","ZZW",NA)[ match( df$val, c(0,1,2,3,NA))]
person IRTFM    schedule 02.06.2015