对于R中满足的条件,逐行评估矩阵

时间:2014-01-06 20:37:38

标签: r matrix

我有以下格式的数据。

    P10_neg._qn P11_neg._qn P12_neg._qn P14_neg._qn P17_neg._qn P24_neg._qn P25_neg._qn
1      -0.025      -0.037      -0.032      -0.061      -0.176       0.033      -0.011
2      -0.029      -0.125       0.003      -0.098       0.117       0.039       0.087
3       0.033      -0.127       0.042       0.014       0.097       0.105       0.048
4       0.033      -0.127       0.042       0.014       0.097       0.105       0.048
5      -0.029      -0.125       0.003      -0.098       0.117       0.039       0.087
6      -0.029      -0.125       0.003      -0.098       0.117       0.039       0.087

例如,我可以检查每行中有多少条目大于0.1的最佳方法是什么,并返回计数向量?

3 个答案:

答案 0 :(得分:3)

您可以使用rowSum功能执行此任务。假设dat是矩阵,那么:

rowSum(dat > 0.1)

使用我们提供的样本数据:

dat <- read.table(text = '   P10_neg._qn P11_neg._qn P12_neg._qn P14_neg._qn P17_neg._qn P24_neg._qn P25_neg._qn
1      -0.025      -0.037      -0.032      -0.061      -0.176       0.033      -0.011
2      -0.029      -0.125       0.003      -0.098       0.117       0.039       0.087
3       0.033      -0.127       0.042       0.014       0.097       0.105       0.048
4       0.033      -0.127       0.042       0.014       0.097       0.105       0.048
5      -0.029      -0.125       0.003      -0.098       0.117       0.039       0.087
6      -0.029      -0.125       0.003      -0.098       0.117       0.039       0.087',
                  row.names = 1, header = TRUE)

rowSums(dat > 0.1)
## 1 2 3 4 5 6 
## 0 1 1 1 1 1 

答案 1 :(得分:1)

apply(dat, 1, function(x) sum(x>.1))
# [1] 0 1 1 1 1 1

答案 2 :(得分:0)

这里有一个Rcpp版本:

// [[Rcpp::export]]
IntegerVector countGreaterThan2(NumericMatrix M,double val) {
  IntegerVector res;
  for (int i=0; i<M.nrow(); i++) {
    NumericVector row = M( i, _);
    double num = std::count_if(row.begin(), row.end(),    
                       [&val](const double& x) -> bool {return x>val;});  
    res.push_back(num);
  }
  return res;
} 

但是rowSum是无与伦比的:

system.time(rowSums(dfx>0.2))
   user  system elapsed 
   0.01    0.00    0.02 
> system.time(countGreaterThan2(dfx,0.2))
   user  system elapsed 
   0.06    0.00    0.06