2013-06-26 3 views
0

У меня проблема с заменой кодов в dataframe из 3890 наблюдений. У моей DataFrame есть символьная переменная df $ IJN, которая содержит значения от 1 до 27 (кроме 2). Я хотел бы заменить их содержательными данными следующим образом:Заменить несколько кодов данных в фрейме данных с именами

Если (1 ИЛИ 6 ИЛИ 10 ИЛИ 14 ИЛИ 18 ИЛИ 22 ИЛИ 26) следует заменить на UL. Если (3 ИЛИ 7 ИЛИ 11 ИЛИ 15 ИЛИ 19 ИЛИ 23 ИЛИ 27) следует заменить на LL. Если (4 ИЛИ 8 ИЛИ 12 ИЛИ 16 ИЛИ 20 ИЛИ 24) следует заменить на UR. Если (5 ИЛИ 9 ИЛИ 13 ИЛИ 17 ИЛИ 21 ИЛИ 25) следует заменить на LR.

(U, L, R и L См верхний, нижний, правый и левый участков в порядке)

Я думал о для() с тем, если() не может справиться с этим также думал о df [который (df == "27")] = "LL" может работать один за другим не уверен! Любая помощь пожалуйста. R v3.1 - Windows 7
E-H Shabana, Париж.

+0

Можете ли вы точные, как вы замените 2 в вашем IJN вектор? Мы подозреваем, что вы забыли это значение из списка сопоставлений. – agstudy

+0

Номера соответствуют фотографиям.Случилось так, что образ 2 не рассматривался в исследовании. Поэтому нет никакой ошибки. – Shabana

ответ

1

Во-первых, давайте сделаем этот пример минимальным и воспроизводимым. Предположим, что вместо 27 значений IJN у вас есть 3. Значение 1 заменяется на «LL», значения 2 и 3 заменяются на «UL». Я положу их в кадре данных 1-колонки

d <- data.frame(IJN = round(runif(n=10, min=1, max=3))) 

Теперь мы создадим второй кадр данных, с каждым возможным значением IJN ровно один раз, и соответствующая метка в отдельной колонке:

refDF <- data.frame(IJN = 1:3, nm=c("LL", "UL", "UL")) 

Наконец, объединить их в один кадр данных:

d2 <- merge(d, refDF, by="IJN") 

Заметим, что это не совсем ответ на ваш вопрос: вместо того, чтобы заменить значения вашей колонки, я добавил новую колонку с другое название , со значениями, соответствующими вашим значениям. Обратите внимание, что merge также переупорядочивает строки столбца (сортирует столбец by, в данном случае df$IJN), но это не должно быть проблемой в большинстве приложений.

+0

Спасибо за быстрый ответ. – Shabana

+0

Добро пожаловать. В stackoverflow вежливо выбрать тот ответ, который вы считаете лучшим, и «принять» его, нажав зеленую галочку рядом с ответом. Это сигнализирует другим пользователям, которые отвечают наиболее полезными, и вознаграждает ответчика несколькими точками репутации. –

2

Решения с использованием пакета qdap:

## reformatted your key 
codes <- list(UL=c(1, 6, 10, 14, 18, 22, 26), 
    LL = c(3, 7, 11, 15, 19, 23, 27), 
    UR = c(4, 8, 12, 16, 20, 24), 
    LR = c(5, 9, 13, 17, 21, 25)) 

## A reproducible example 
set.seed(10) 
IJN <- c("UR", sample(unlist(codes,,FALSE), 20, TRUE)) 

## Use lookup and list2df 
lookup(IJN, list2df(codes), missing = NULL) 

## > IJN 
## [1] "UR" "LL" "LL" "LL" "UR" "UL" "UL" "LL" "LL" "UR" 
## [11] "LL" "UR" "UR" "UL" "UR" "LL" "LL" "UL" "UL" "LL" 
## [21] "LR" 

Последних индексы строки, чтобы найти значение в векторе IJN, которые соответствуют ключу и заменяют только их. lookup - это хэширование среды, так что это довольно быстро.

Я вижу, что вы новый пользователь SO. Добро пожаловать. По мере того, как вы узнаете нормы сообщества, вы улучшаетесь при публикации. Одна вещь, которую я хотел бы спросить, это то, что вы работаете над тем, чтобы более подробно обсудить свой вопрос с помощью reproducible example. Пожалуйста, use code tags также.

+0

@agstudy хороший вызов на 'set.seed'. Нет поиска не excel inspired, это продукт необходимости простого поиска (от 1 до 1 соответствия) с большими наборами данных. Люди на www.talkstats.com были очень полезны в своем развитии. –

+0

Я должен посмотреть на пакет qdap. Спасибо за ваш ответ rapide. – Shabana

1

Вы можете сделать это с помощью for петли и много if с, но более идиоматических, vectorised R подход должен был бы использовать ifelse:

dj$IJN <- ifelse(dj$IJN %in% c(1, 6, 10, 14, 18, 22, 26), "UL", 
      ifelse(dj$IJN %in% c(3, 7, 11, 15, 19, 23, 27), "LL", 
      ifelse(dj$IJN %in% c(4, 8, 12, 16, 20, 24, 28), "UR", "LR"))) 
+0

Я подозреваю, что OP сделал опечатку в публикации этого большого блока псевдокода. –

+0

Это просто и прекрасно работает. Большое спасибо. – Shabana