Обобщающие факторы в Dataframe

Мой набор данных выглядит следующим образом: http://dl.dropbox.com/u/822467/Data.csv

Моя ситуация такова. У меня есть ряд вопросов (всего 27), ответы на которые имеют бинарный характер. 0 = Нет, 1 = Да, 999 = Отсутствует.

Моя первая проблема - как превратить все столбцы в факторы. Я могу делать их один за другим, используя as.factors, но это займет вечность.

Моя вторая проблема заключается в том, что мне нужно резюме с вопросами в качестве заголовков, а также с «да» и «нет» в качестве первого столбца, а ячейки заполняются с частотой «да» и «нет» для каждого вопроса.

Мне также понадобится еще один фрейм данных с%. Я очень ценю любую помощь, которую могу оказать. Я просмотрел сводку и сводку пакета Hmisc, но безрезультатно.


person RJ-    schedule 18.11.2011    source источник
comment
Я был бы более склонен помочь, если бы вы показали, что уже сделали. В противном случае кажется, что вы просите бесплатную техническую поддержку.   -  person Andrie    schedule 18.11.2011
comment
Ваша ссылка на Dropbox мертва. Пожалуйста, вставьте несколько реальных строк образца файла CVS. В противном случае ответы будут иметь смысл только для вас, а не для всех нас.   -  person smci    schedule 28.10.2012


Ответы (3)


Четыре строки кода ...

dat <- read.csv("http://dl.dropbox.com/u/822467/Data.csv")
dat[, -1] <- lapply(dat[, -1], factor, levels=c(0, 1, 999), 
    labels=c("No", "Yes", NA))
xx <- do.call(rbind, lapply(dat[, -1], table, useNA="always"))
cbind(xx, sum=rowSums(xx), prop.table(xx, margin=1))

... дает такой результат:

    No Yes <NA> sum       No      Yes     <NA>
Q1   7  57    0  64 0.109375 0.890625 0.000000
Q2  40  22    2  64 0.625000 0.343750 0.031250
Q3  28  36    0  64 0.437500 0.562500 0.000000
Q4  43  18    3  64 0.671875 0.281250 0.046875
Q5  24  39    1  64 0.375000 0.609375 0.015625
Q6  21  42    1  64 0.328125 0.656250 0.015625
Q7  15  49    0  64 0.234375 0.765625 0.000000
Q8   4  60    0  64 0.062500 0.937500 0.000000
Q9  60   4    0  64 0.937500 0.062500 0.000000
Q10 39  25    0  64 0.609375 0.390625 0.000000
Q11 55   8    1  64 0.859375 0.125000 0.015625
Q12 20  44    0  64 0.312500 0.687500 0.000000
Q13 49  15    0  64 0.765625 0.234375 0.000000
Q14 49  15    0  64 0.765625 0.234375 0.000000
Q15 51  13    0  64 0.796875 0.203125 0.000000
Q16 61   3    0  64 0.953125 0.046875 0.000000
Q17 41  23    0  64 0.640625 0.359375 0.000000
Q18 60   4    0  64 0.937500 0.062500 0.000000
Q19 64   0    0  64 1.000000 0.000000 0.000000
Q20 60   4    0  64 0.937500 0.062500 0.000000
Q21 60   4    0  64 0.937500 0.062500 0.000000
Q22 43  21    0  64 0.671875 0.328125 0.000000
Q23 59   4    1  64 0.921875 0.062500 0.015625
Q24 10  54    0  64 0.156250 0.843750 0.000000
Q25 54   9    1  64 0.843750 0.140625 0.015625
Q26 24  39    1  64 0.375000 0.609375 0.015625
Q27  0   0   64  64 0.000000 0.000000 1.000000
person Andrie    schedule 18.11.2011
comment
Я заметил, что в вопросе 19 указано 64 как для «да», так и для «нет». При устранении неполадок это сводится к применению (dat [, -1], 2, table), который дает 64 для Нет и ничего для Да. есть идеи, как получить заявку на получение 0 за да? - person RJ-; 18.11.2011
comment
@ RJ - ответ отредактирован для использования lapply вместо apply - это устраняет вопрос 19 - person Andrie; 18.11.2011

Чтобы преобразовать все столбцы в коэффициент, вы можете использовать lapply и преобразовать обратно в data.frame, поскольку data.frames очень похожи на списки:

tab <- read.csv("Data.csv")
tab <- as.data.frame(lapply(tab, as.factor))

В остальном я согласен с комментарием Андри ... Вы пробовали функцию table? Это может вас заинтересовать.

person maressyl    schedule 18.11.2011
comment
спасибо @Andrie. Отмечал ваши комментарии о том, что я пытался отказаться от того, что я пробовал. Буду иметь это в виду, когда напишу в следующий раз. - person RJ-; 18.11.2011

Вот еще одно решение с использованием reshape2.

dat  <- read.csv("http://dl.dropbox.com/u/822467/Data.csv")
dat2 <- setNames(dcast(melt(dat, 1), variable ~ value), c('Q', 'No', 'Yes', NA))
dat2[,-1] = dat2[,-1]/rowSums(dat2[,-1])
person Ramnath    schedule 18.11.2011