对于多个数据帧循环ifelse

时间:2018-11-21 13:43:49

标签: r loops if-statement

我想创建一个循环以重复数据集列表中的代码行。 每个数据集如下:

gwas_1 
   ID   p
    1   0.0000005
    2   0.0123474
    ... 
gwas_2 
   ID   p
    1   0.0000055
    2   0.5854587
    ... 

所以我想创建一个新列并检查每个数据集中新列中的频率。我之前是这样做的

  data=gwas_1
  data$p_threshold <- ifelse(data$p<0.001, 1, 0)
  table (data$p_threshold)
  data=gwas_2
  data$p_threshold <- ifelse(data$p<0.001, 1, 0)
  table (data$p_threshold) 

但是意识到它可能不是很有效。您能否帮助我创建一个循环,因为我的循环不起作用(“错误:$运算符对于原子向量无效”):

 list=c("gwas_1, gwas_2, gwas_3")
 for (db in list){
 db$p_threshold <- ifelse(db$p<0.001, 1, 0)
 table (db$p_threshold)
 }

1 个答案:

答案 0 :(得分:1)

尝试一下:

设置数据:

#include <iostream>
#include <fstream>
#include <sstream>

int main() {
    std::basic_string<char32_t> str = U"abcdef";
    std::basic_stringstream<char32_t> data{ str };

    //std::basic_ifstream<char32_t> data("test.txt", std::ios::binary);

    size_t dist = std::distance(std::istreambuf_iterator<char32_t>(data), std::istreambuf_iterator<char32_t>());

    std::cout << dist << std::endl;

    return 0;
}

代码:

set.seed(1337)
tmp <- data.frame(p = runif(100)*.007)
l1  <- list(gwas_1 = tmp, gwas_2 = tmp, gwas_3 = tmp)

结果:

lapply(l1, function(x) table(+(x[["p"]]<0.001)))

  • 将所有data.frames放入列表(如#$gwas_1 # # 0 1 #88 12 # #$gwas_2 # # 0 1 #88 12 # #$gwas_3 # # 0 1 #88 12
  • 使用l1

已经:比lapply快15倍

ifelse