2014-12-07 3 views
0

Вот кадр данных Я работаю с:Преобразование кадра данных в числовой кадр данных в R

c1 = c('a', 'b', 'c', 'd') 
c2 = c('d', 'a', 'd', 'c') 
c3 = c('a', 'c', 'd', 'b') 
c4 = c('a', 'c', 'b', 'd') 
df = data.frame(c1, c2, c3, c4) 

c1 c2 c3 c4 
a  d  a  a 
b  a  c  c 
c  d  d  b 
d  c  b  d 

Я хотел бы преобразовать с помощью этой шкалы: а = 1, Ь = 2, с = 3, d = 4. Так что я получаю что-то вроде этого:

c1 c2 c3 c4 
    1 4 1 1 
    2 1 3 3 
    3 4 4 2 
    4 3 2 4 

Это то, что я придумал:

for(i in colnames(df)){ 
    df$i = gsub("a", 1, df$i) 
    df$i = gsub("b", 2, df$i) 
    df$i = gsub("c", 3, df$i) 
    df$i = gsub("d", 4, df$i) 
} 

Но это не работает. Должен ли я использовать gsub здесь, или есть более простой способ сделать это?

+1

аналогично ответу ниже, если ваш ключ не был последовательным, вы можете сделать свой собственный 'ключ <- с («а»=«1»,«б '=' 2 ',' c '=' 3 ',' d '=' 4 '); df [] <- key [as.matrix (df)] ' – rawr

ответ

3

Мы можем сделать это несколькими способами. Один из способов - преобразовать data.frame в matrix, а затем match с элементами unique в наборе данных. то есть в этом случае letters[1:4]. Но результатом будет вектор. Мы можем преобразовать его в тот же самый dimensions исходного набора данных, указав dim как dim(df) ie. dim<-(..., dim(df). Также, пожалуйста, проверьте here, чтобы узнать больше о задании.

df2 <- df 
df2[] <- `dim<-`(match(as.matrix(df), letters[1:4]), dim(df)) 
df2 
# c1 c2 c3 c4 
#1 1 4 1 1 
#2 2 1 3 3 
#3 3 4 4 2 
#4 4 3 2 4 

Приведенный выше код может быть разделен на отдельные строки:

v1 <- match(as.matrix(df), letters[1:4]) 
df2[] <- `dim<-`(v1, dim(df)) 

или

df2[] <- matrix(v1, ncol=ncol(df), row=nrow(df)) 

Другой вариант заключается в преобразовании столбцов набора данных, чтобы factor с уровнями, указанными в качестве уникальных значений набора данных а затем преобразовать его в numeric по as.numeric. Это может быть сделано в loop с помощью lapply

df2[] <-lapply(df, function(x) as.numeric(factor(x, levels=letters[1:4]))) 
+0

Действительно красиво, и более или менее точно, что я имел в виду, но делать это в одной строке немного похоже на хвастовство, не так ли? :) Разделив его и объяснив немного, я уверен, что мы будем очень благодарны. – Aaron

+0

@ Аарон Я раздержу код и объясню. – akrun

+0

@akrun, что делает 'dim <-' здесь? это встроенная функция для r? –

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