Моя цель — получить таблицу, которая для списка категориальных переменных возвращает (от самого левого столбца до самого правого столбца): имя категориальной переменной, уровень категориальной переменной, частоту для первого уровня бинарной групповой переменной, частота для второго уровня бинарной группирующей переменной, тестовая статистика хи-квадрат, p.value и метод тестирования. Пример вывода, который я хочу, представлен в самом низу страницы. Текущие выходные данные и код относятся к одной категориальной переменной. Я стараюсь не ставить лошадь впереди телеги. Прямо сейчас получить правильный формат для одной переменной будет хорошо. Я поработаю над тем, чтобы заставить его делать это для строки, а затем свяжу их вместе.
Код представляет то, что я смог выяснить до сих пор. Я совершенно уверен, что есть более простой способ сделать это. Мне говорили о table::table, но я мог заставить его делать именно то, что я хотел. В настоящее время я не могу понять изменение формы (а затем, как избавиться от дубликатов в последних трех столбцах, когда это сработало, но я еще не там).
Любая помощь с использованием текущего кода или другого метода будет очень признательна.
#make data (I couldn't get return() to work, so I used <<)
get.data<-function(){
set.seed(1)
cat1 <-sample(c(1,2), 100, replace=T)
cont1<-rnorm(100, 25, 8)
cont2<-rnorm(100, 0, 1)
cont3<-rnorm(100, 6, 14.23)
cont4<-rnorm(100, 25, 8)*runif(5, 0.1, 1)
cat2<-sample(c(1,2,3,4),100,replace=TRUE)
cat3<-sample(c(1,2,3,4,5),100,replace=TRUE)
cat4<-sample(c("Caucasian","African American", "Latino", "Multi-Racial", "No
Response"),100,replace=TRUE)
group<-sample(c(0,1), 100, replace=T)
sex<-sample(c("male", "female"), 100, replace=T)
one <<-data.frame(group, sex,cat1, cont1, cont2, cont3, cont4,cat2,cat3,cat4)
}
get.data()
#getting the two bits of data I would like
attach(one)
long <- (with(one, table(cat2,group)))
test<-with(one, chisq.test(cat2,group))
kk<-c(test$statistic,test$p.value,test$method)
detach(one)
#merging them together
res<-merge(as.data.frame(as.matrix(long)), as.data.frame(as.matrix(kk)),
all=TRUE, sort=FALSE)
#unsuccessfully reshaping the data
wider <- reshape(as.data.frame(res), idvar = cat2,
timevar = "V1", direction = "wide")
Вот как выглядит вывод из 'res':
# cat2 group Freq V1
#1 1 0 17 1.16345446805217
#2 2 0 11 1.16345446805217
#3 3 0 13 1.16345446805217
#4 4 0 13 1.16345446805217
#5 1 1 12 1.16345446805217
#6 2 1 13 1.16345446805217
#7 3 1 9 1.16345446805217
#8 4 1 12 1.16345446805217
#9 1 0 17 0.761782111152171
#10 2 0 11 0.761782111152171
#11 3 0 13 0.761782111152171
#12 4 0 13 0.761782111152171
#13 1 1 12 0.761782111152171
#14 2 1 13 0.761782111152171
#15 3 1 9 0.761782111152171
#16 4 1 12 0.761782111152171
#17 1 0 17 Pearson's Chi-squared test
#18 2 0 11 Pearson's Chi-squared test
#19 3 0 13 Pearson's Chi-squared test
#20 4 0 13 Pearson's Chi-squared test
#21 1 1 12 Pearson's Chi-squared test
#22 2 1 13 Pearson's Chi-squared test
#23 3 1 9 Pearson's Chi-squared test
#24 4 1 12 Pearson's Chi-squared test
ВОТ ЧТО Я ХОЧУ, ЧТОБЫ ВЫВОД ВЫГЛЯДИЛ:
Variable Response Group1.Freq Group2.Freq Test.Stat p.value method
Cat2 1 17 12 1.16 0.761 Pearson's Chi...
2 11 13
3 13 9
4 13 12
НОВАЯ ПРОБЛЕМА: я использовал предложение Рама, чтобы создать функцию, чтобы я мог создать data.frame для нескольких категориальных переменных. Я придумал этот код. Но вывод испортился во время шагов rbind и lapply. Мне интересно, как решить эту проблему. Опять же, вывод находится внизу.
get.data<-function(){
set.seed(1)
cat1 <-sample(c(1,2), 100, replace=T)
cont1<-rnorm(100, 25, 8)
cont2<-rnorm(100, 0, 1)
cont3<-rnorm(100, 6, 14.23)
cont4<-rnorm(100, 25, 8)*runif(5, 0.1, 1)
cat2<-sample(c(1,2,3,4),100,replace=TRUE)
cat3<-sample(c(1,2,3,4,5),100,replace=TRUE)
cat4<-sample(c("Caucasian","African American", "Latino", "Multi-Racial", "No
Response"),100,replace=TRUE)
group<-sample(c(0,1), 100, replace=T)
sex<-sample(c("male", "female"), 100, replace=T)
one <<-data.frame(group, sex,cat1, cont1, cont2, cont3, cont4,cat2,cat3,cat4)
}
get.data()
make.table<-function(catvars,group,data){
attach(data)
get.chi.stuff<-function(cat, group){
long <- table(cat,group)
test<-chisq.test(cat,group)
kk<-c(test$statistic,test$p.value,test$method)
res <- data.frame(matrix(NA,nrow(long),7))
names(res) <- c("Variable", "Response", "Group1.Freq", "Group2.Freq",
"Test.Stat", "p.value", "method")
res[1,1] <- deparse(substitute(cat))
res[,2] <- row.names(long)
res[,3:4] <- long[,1:2]
res[1,5:7] <- kk
return(res)
}
tables<<-do.call(rbind,lapply(data[,catvars],get.chi.stuff,group=group))
detach(data)
}
make.table(catvars=catvars,group=group, data=one)
ВЫВОД (в настоящее время он не форматируется так, как должен, но проблема в row.names и Variable. Остальное выглядит нормально)
row.names Variable Response Group1.Freq Group2.Freq Test.Stat p.value method
cat2.1 X[[1L]] 1 17 12 1.16345446805217 0.761782111152171 Pearson's Chi-squared test
cat2.2 NA 2 11 13 NA NA NA
cat2.3 NA 3 13 9 NA NA NA
cat2.4 NA 4 13 12 NA NA NA
cat3.1 X[[2L]] 1 8 15 5.68288366946583 0.224115426983988 Pearson's Chi-squared test
6 cat3.2 NA 2 10 7 NA NA NA
7 cat3.3 NA 3 14 11 NA NA NA
8 cat3.4 NA 4 8 7 NA NA NA
9 cat3.5 NA 5 14 6 NA NA NA
10 cat4.1 X[[3L]] African American 9 18 8.73180996607079 0.0681639164530817 Pearson's Chi-squared test
11 cat4.2 NA Caucasian 14 5 NA NA NA
12 cat4.3 NA Latino 6 7 NA NA NA
13 cat4.4 NA Multi-Racial 14 9 NA NA NA
14 cat4.5 NA No
Response 11 7 NA NA NA
15 sex.1 X[[4L]] female 30 17 2.74327353028067 0.0976645121155453 Pearson's Chi-squared test with Yates' continuity correction
16 sex.2 NA male 24 29 NA NA NA