如何在R中对多行FASTER运行Chisq测试?

时间:2018-09-29 17:45:34

标签: r performance loops dplyr chi-squared

我已经设法使用R中的循环执行chisq-test,但是对于大数据来说它非常慢,我想知道您是否可以通过dplyr之类的方法更快地完成它?我已经尝试过dplyr,但是我一直都出错,但我不确定原因。

这是我的数据的简短示例:

import 'package:flutter/material.dart';

const String kTitle = 'Loop Wheel Demo';

void main() => runApp(new LoopWheelDemo());

class LoopWheelDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: kTitle,
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  HomePage({Key key,}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final _style = Theme.of(context).textTheme.display2;
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(kTitle),
      ),
      body: new Center(
        child: new ConstrainedBox(
          constraints: BoxConstraints(
            // Set height to one line, otherwise the whole vertical space is occupied.
            maxHeight: _style.fontSize,
          ),
          child: new ListWheelScrollView.useDelegate(
            itemExtent: _style.fontSize,
            childDelegate: ListWheelChildLoopingListDelegate(
              children: List<Widget>.generate(
                10, (index) => Text('${index + 1}', style: _style),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

我想做的是在df和cs的每一行之间运行chisq-test。然后给我统计数据和p.value以及行名。

这是我的循环代码:

    df
           1        2        3        4        5
row_1  2260.810 2136.360 3213.750 3574.750 2383.520
row_2   328.050  496.608  184.862  383.408  151.450
row_3   974.544  812.508 1422.010 1307.510 1442.970
row_4  2526.900  826.197 1486.000 2846.630 1486.000
row_5  2300.130 2499.390 1698.760 1690.640 2338.640
row_6   280.980  752.516  277.292  146.398  317.990
row_7   874.159  794.792 1033.330 2383.420  748.868
row_8   437.560  379.278  263.665  674.671  557.739
row_9  1357.350 1641.520 1397.130 1443.840 1092.010
row_10 1749.280 1752.250 3377.870 1534.470 2026.970


cs 
 1 1 1 2 1 2 2 1 2 3

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我想您确实希望逐列进行此操作。知道Biobase::exprs(PANCAN_w))的结构将大有帮助。最好使用Biobase软件包中的示例代替无法找到的数据集。

这是我可能使用过的代码的实现。注意:如果希望将数字和字符值混合使用,则不想使用矩阵来存储结果。您将把所有数字强制为字符:

value = data.frame(p_val =NA,  stat =NA, exprs = rownames(df) )

for (i in 1:col(df)) {
  # tbl <- table((df[i,]), cs) ### No use seen for this
  # I changed the indexing in the next line to compare columsn to the standard `cs`.

  tst <- chisq.test(df[ ,i], cs)  #chisq.test not vectorized, need some sort of loop

  value[i, 1:2] <- tst[ c('p.value', 'statistic')]  # one assignment per row
     }

很显然,您需要将df的每个实例(由于还有一个df函数,因此也不是很好的名字)更改为Biobase::exprs(PANCAN_w)