Слияние и изменение данных/таблицы с несколькими таблицами разных размеров

Моя цель — получить таблицу, которая для списка категориальных переменных возвращает (от самого левого столбца до самого правого столбца): имя категориальной переменной, уровень категориальной переменной, частоту для первого уровня бинарной групповой переменной, частота для второго уровня бинарной группирующей переменной, тестовая статистика хи-квадрат, 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

person Andrew Taylor    schedule 13.03.2014    source источник


Ответы (1)


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

Вы создали все необходимые компоненты в res в своих переменных, long, kk и test. Итак, теперь нужно сшить все вместе в том формате, который вам нужен.

Это не очень элегантно, потому что мы строим желаемые результаты вручную, столбец за столбцом. Вы можете бросить все это в функцию.

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] <- names(attr(test$observed, "dimnames")[1])
res[,2] <- row.names(long)
res[,3:4] <- long[,1:2]
res[1,5:7] <- kk
res
#  Variable Response Group1.Freq Group2.Freq        Test.Stat
# 1     cat2        1          17          12 1.16345446805217
# 2     <NA>        2          11          13             <NA>
# 3     <NA>        3          13           9             <NA>
# 4     <NA>        4          13          12             <NA>
#            p.value                     method
# 1 0.761782111152171 Pearson's Chi-squared test
# 2              <NA>                       <NA>
# 3              <NA>                       <NA>
# 4              <NA>                       <NA>
person Ram Narasimhan    schedule 13.03.2014
comment
Это сработало хорошо. Мне пришлось изменить: res[1,1] ‹- имена (attr(test$observed, dimnames)[1]) на: res[1,1] ‹- deparse(substitute(cat)) когда это было в функция, потому что она брала «кошку» вместо того, что там было (кошка1, кошка2, секс и т. д.). Однако у меня есть новая проблема, как только я настроил ее для повторения набора переменных и связывания их вместе. Я предполагаю, что это проблема использования rbind для чего-то с несколькими строками в первую очередь? Если у вас есть время, я хотел бы получить отзыв о возможной обходной/правильной функции, которую можно использовать для их объединения. Спасибо в любом случае! - person Andrew Taylor; 14.03.2014
comment
Что касается вашей проблемы rbind и lapply, могу ли я предложить создать новый вопрос. Этот вопрос стал большим, как это. Если вы опубликуете MRE (минимально воспроизводимый пример), здесь многие вам помогут. - person Ram Narasimhan; 14.03.2014