Выполнение построчного теста chisq на фрейме данных и запись результата в виде таблицы

У меня есть кадр данных, подобный этому:

df1 <- data.frame(c(31,3447,12,1966,39,3275),
                  c(20,3460,10,1968,30,3284),
                  c(334,3146,212,1766,338,2976),
                  c(36,3442,35,1943,47,3267),
                  c(81,3399,71,1907,112,3202),
                  c(22,3458,22,1956,42,3272))

colnames(df1) <- c("Site1.C1","Site1.C2","Site2.C1","Site2.C2","Site3.C1","Site3.C2")

df1
  Site1.C1 Site1.C2 Site2.C1 Site2.C2 Site3.C1 Site3.C2
1       31       20      334       36       81       22
2     3447     3460     3146     3442     3399     3458
3       12       10      212       35       71       22
4     1966     1968     1766     1943     1907     1956
5       39       30      338       47      112       42
6     3275     3284     2976     3267     3202     3272

Я преобразовываю каждую строку в таблицу, а затем выполняю тест chisq.
Чтобы получить определенные значения из результата chisq (значение p, параметр, статистика, ожидаемое значение и т. д.), мне приходится повторять тест chisq несколько раз. над (очень уродливым и громоздким способом), используя следующий код:

df2 <- df1 %>% rowwise() %>% mutate(P=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$p.value,
                                df=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$parameter,
                                Site1.c1.exp=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$expected[1,1],
                                Site1.c2.exp=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$expected[1,2],
                                Site2.c1.exp=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$expected[2,1],
                                Site2.c2.exp=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$expected[2,2],
                                Site3.c1.exp=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$expected[3,1],
                                Site3.c2.exp=chisq.test(rbind(c(Site1.C1,Site1.C2),c(Site2.C1,Site2.C2),c(Site3.C1,Site3.C2)))$expected[3,2])

as.data.frame(df2)

  Site1.C1 Site1.C2 Site2.C1 Site2.C2 Site3.C1 Site3.C2            P df Site1.c1.exp Site1.c2.exp Site2.c1.exp Site2.c2.exp Site3.c1.exp Site3.c2.exp
1       31       20      334       36       81       22 2.513166e-08  2     43.40840     7.591603     314.9237     55.07634     87.66794     15.33206
2     3447     3460     3146     3442     3399     3458 2.760225e-02  2   3391.05464  3515.945362    3234.4387   3353.56132   3366.50668   3490.49332
3       12       10      212       35       71       22 4.743725e-04  2     17.92818     4.071823     201.2845     45.71547     75.78729     17.21271
4     1966     1968     1766     1943     1907     1956 1.026376e-01  2   1928.02242  2005.977577    1817.7517   1891.24831   1893.22588   1969.77412
5       39       30      338       47      112       42 2.632225e-10  2     55.49507    13.504934     309.6464     75.35362    123.85855     30.14145
6     3275     3284     2976     3267     3202     3272 2.686389e-02  2   3216.55048  3342.449523    3061.5833   3181.41674   3174.86626   3299.13374

Есть ли более элегантный способ выполнить тест chisq только один раз и зафиксировать результат в виде таблицы в той же строке, а затем извлечь значения по мере необходимости в дополнительные столбцы?
В моем фрейме данных более миллиона строк и некоторые дополнительные переменные, не используемые в тесте Chisq.

Спасибо.


person cityofwisdom    schedule 28.04.2017    source источник


Ответы (1)


С помощью @akrun я смог получить желаемый результат, используя следующий код:

df2 <- df1 %>% rowwise() %>% mutate(result=list(chisq.test(rbind(c(Site1.C1,Site1.C2),c(S‌​ite2.C1,Site2.C2),c(‌​Site3.C1,Site3.C2)))‌​))
person cityofwisdom    schedule 28.04.2017