在数据帧上执行逐行chisq测试并将结果捕获为tibble

时间:2017-04-28 19:20:09

标签: r dplyr tibble

我有一个与此类似的数据框:

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测试,并将结果作为tibble捕获到同一行,然后根据需要将值提取到其他列中?
我的数据框有超过一百万行和一些其他变量未用于Chisq测试。

谢谢。

1 个答案:

答案 0 :(得分:0)

通过@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)))‌​))