2015-09-23 5 views
4

У меня есть данные, что выглядит следующим образом:Создать новый столбец на основе значений других переменных

Набор из 10 переменных символов

Char<-c("A","B","C","D","E","F","G","H","I","J") 

и кадр данных, который выглядит следующим образом

Col1<-seq(1:25) 
Col2<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5) 
DF<-data.frame(Col1,Col2) 

Что я хотел бы сделать, так это добавить третий столбец в фрейм данных с логикой 1 = A, 2 = B, 3 = C и т. Д. Таким образом, конечный результат будет

Col3<-c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D","E","E","E","E","E") 
DF<-data.frame(Col1,Col2,Col3) 

Для этого простого примера я мог бы пойти с простой заменой, как этот вопрос: Create new column based on 4 values in another column

Но мой фактический набор данных гораздо больше, с намного большим количеством переменных, чем эта простая Например, выписывание эквивалентов, как в приведенном выше ответе, не является возможным.

Поэтому я хотел бы иметь немного кода, который может быть применен к гораздо большему кадру данных. Возможно, что-то, что зациклилось на всех значениях Col2 и соответствовало их местоположению Char.

1=Char[1] 2=Char[2] 3=Char[3]...... for the entire length of Col2 

Или любой другой способ, который может масштабироваться до тех пор чудовищным кадр данных

+3

'Char [Col2]' дает выход в вашем примере. Это все, что вам нужно? –

+2

Мне нравится простота этого. Это хорошо работает для этого примера, но в моем наборе данных Col2 не является простой серией чисел. Но если бы я мог взять мои мои фактические данные и превратиться в ряд чисел, как указано выше (возможно, используя уникальные?), Тогда этот подход был бы идеальным. – Vinterwoo

+2

Если ваши коды поиска различаются, вы можете назвать вектор 'Char', и он будет действовать как таблица поиска. 'names (Char) <- codes'. Затем вы можете использовать 'Char [Col2]', и он будет подмножаться над именами, а не индексом. –

ответ

3

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

for (i in length(DF$Col2)) { 
    DF$Col3[i] <- Char[DF$Col2[i]] 
} 

Этого было бы достаточно? Я думаю, вы могли бы также unique(DF$Col2) или levels(factor(DF$Col2))

Возможно, хотя я не понимаю ваш вопрос.

+1

Мне нравится петли, поскольку я считаю их более интуитивными – Vinterwoo

3

Если вы хотите использовать каждый столбец в качестве индекса в некоторый вектор (я буду использовать letters, так что я могу индекс до 25), возвращая кадр данных одного и те же размерности DF, вы можете использовать:

transformed <- as.data.frame(lapply(DF, function(x) letters[x])) 
head(transformed) 
# Col1 Col2 
# 1 a a 
# 2 b a 
# 3 c a 
# 4 d a 
# 5 e a 
# 6 f b 

вы могли бы совместить это с исходным кадром данных с cbind(DF, transformed).

3

Почему бы не сделать ключ и не присоединиться?

library(dplyr) 

letter_key = data_frame(letter__ID = 1:26, 
         letter = letters) 

DF %>% 
    rename(letter__ID = Col2) %>% 
    left_join(letter_key) 

Такого рода вещи также может быть сделано с факторами

5
# Values that Col2 might have taken 
levels = c(1, 2, 3, 4, 5) 

# Labels for the levels in same order as levels 
labels = c('A', 'B', 'C', 'D', 'E') 

DF$Col3 <- factor(DF$Col2, levels = levels, labels = labels) 
Смежные вопросы