2015-06-09 2 views
-1

Итак, у меня есть длинный набор данных. Каждый столбец (от t1 до t ... n) имеет одинаковые уровни или категории. В общей сложности более 200 категорий или уровней и 144 столбца (переменных).Последние разработки в перекодировке повторяющихся переменных в R?

id t1  t2  t3    t...n 
"1" "eating" "tv"  "conversation" "..." 
"2" "sleep" "driving" "relaxing"  "..." 
"3" "drawing" "kissing" "knitting"  "..." 
"..." "..."  "..."  "..."   "..." 

Переменные t1 имеют одинаковые уровни, равные t2 и т. Д. Что мне нужно, это перекодировка в стиле цикла для каждого столбца (но избегание цикла).

Я хотел бы избежать обычного

seq$t1[seq$t1== "drawing"] <- 'leisure' 
seq$t1[seq$t1== "eating"] <- 'meal' 
seq$t1[seq$t1== "sleep"] <- 'personal care' 
seq$t1[seq$t1== "..."] <- ... 

Самый удобный стиль перекодировка будет что-то вроде

c('leisure') = c('drawing', 'tv', ...) 

Это помогло бы мне лучше кластерных переменных в большие категории.

Есть ли какие-то новые и более простые методы перекодирования в R, появившиеся в последнее время? Что бы вы посоветовали мне использовать?

Это образец моего реального набора данных, 5 повторных наблюдений (в столбце) для 10 респондентов (в строках).

dtaSeq = structure(c("Wash and dress", "Eating", "Various arrangements",  "Cleaning dwelling", "Ironing", "Activities related to sports", 
"Eating", "Eating", "Other specified construction and repairs", 
"Other specified physical care & supervision of a child", "Wash and dress", 
"Filling in the time use diary", "Food preparation", "Wash and dress", 
"Ironing", "Travel related to physical exercise", "Eating", "Eating", 
"Other specified construction and repairs", "Other specified physical care & supervision of a child", 
"Wash and dress", "Filling in the time use diary", "Food preparation", 
"Wash and dress", "Food preparation", "Wash and dress", "Eating", 
"Eating", "Other specified construction and repairs", "Other specified  physical care & supervision of a child", 
"Wash and dress", "Filling in the time use diary", "Baking", 
"Teaching the child", "Food preparation", "Wash and dress", "Eating", 
"Eating", "Other specified construction and repairs", "Other specified physical care & supervision of a child", 
"Dish washing", "Unspecified TV watching", "Reading periodicals", 
"Teaching the child", "Food preparation", "Reading periodicals", 
"Eating", "Eating", "Other specified construction and repairs", 
"Feeding the child", "Laundry", "Unspecified TV watching", "Cleaning dwelling", 
"Teaching the child", "Eating", "Eating", "Eating", "Eating", 
"Other specified construction and repairs", "Feeding the child"), 
.Dim = c(10L, 6L), .Dimnames = list(c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10"), c("act1.050", "act1.051", "act1.052", 
"act1.053", "act1.054", "act1.055"))) 
+0

Укажите, пожалуйста, пример и/или подмножество данных с помощью 'dput()'. Самый простой способ сделать это - это, вероятно, функция 'recode()' из пакета ** car **. – Thomas

+0

'seq [seq ==" sleep "| seq == "расслабляющий"] <- "личная забота"? – Victorp

ответ

1

Вы, кажется, не имеют полностью определенные правила перекодирования для ваших реальных данных, поэтому я сделал некоторые до:

recodes <- list("meals"=c("Eating"), 
       "leisure"=c("Reading Periodicals", 
          "Unspecified TV watching"), 
       "child care"=c("Feeding the child","Teaching the child"), 
       "house care"=c("Food preparation","Dish washing", 
           "Cleaning dwelling","Ironing")) 

Вот функция перекодировки общего назначения. car::recode делает работа, , но я нахожу его немного неуклюжим. Там также plyr::revalue, но он один к одному, а не много-к-одному.

recodeFun <- function(x) { 
    for (i in seq_along(recodes)) { 
     x[x %in% recodes[[i]]] <- names(recodes)[i] 
      } 
      return(x) 
} 
d2 <- recodeFun(dtaSeq) 
+0

Да, это было нечто подобное, что я имел в виду. Поскольку существует так много категорий, проще ли создавать список. Благодарю. – giacomo

2

Насколько я знаю, car пакет может обрабатывать строки или символы в своих recode -функции, но я не уверен. Альтернативой может быть sjmisc-package, что делает объезд путем преобразования строк в числовые значения и установить обратно метки значений позже:

library(sjmisc) 
dtaSeq <- as.data.frame(dtaSeq) 
# convert to values 
dtaSeq.values <- to_value(dtaSeq) 
# random recode example, use your own values for clustering here 
dtaSeq.values <- rec(dtaSeq.values, "1:3=1; 4:6=2; else=3") 
# set value labels, these will be added as attributes 
dtaSeq.values <- set_val_labels(dtaSeq.values, c("meal", "leisure", "personal care")) 
# replace numeric values with assicated label attributes 
dtaSeq.values <- to_label(dtaSeq.values) 

Результат:

> head(dtaSeq.values) 
     act1.050  act1.051 act1.052  act1.053  act1.054  act1.055 
1 personal care personal care leisure personal care   meal  leisure 
2   meal   meal  meal   meal personal care personal care 
3 personal care   meal  meal   meal  leisure   meal 
4   meal personal care leisure personal care personal care  leisure 
5  leisure  leisure  meal  leisure  leisure   meal 
6   meal personal care leisure personal care  leisure   meal 

преимущество функции sjmisc-перекодировать есть, если у вас есть кадр данных с переменными с подобной «структурой», вы можете перекодировать полный кадр данных только одним звонком до rec.

Вам это поможет?

+0

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

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