首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于多个数据帧的ifelse循环

用于多个数据帧的ifelse循环
EN

Stack Overflow用户
提问于 2018-11-21 21:43:49
回答 1查看 170关注 0票数 0

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

代码语言:javascript
复制
gwas_1 
   ID   p
    1   0.0000005
    2   0.0123474
    ... 
gwas_2 
   ID   p
    1   0.0000055
    2   0.5854587
    ... 

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

代码语言:javascript
复制
  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) 

但意识到这可能不是很有效。你能帮我创建一个循环吗,因为我的循环不工作(“错误:$ operator对于原子向量无效”):

代码语言:javascript
复制
 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)
 }
EN

回答 1

Stack Overflow用户

发布于 2018-11-21 21:55:57

试试这个:

设置数据:

代码语言:javascript
复制
set.seed(1337)
tmp <- data.frame(p = runif(100)*.007)
l1  <- list(gwas_1 = tmp, gwas_2 = tmp, gwas_3 = tmp)

代码:

代码语言:javascript
复制
lapply(l1, function(x) table(+(x[["p"]]<0.001)))

结果:

代码语言:javascript
复制
#$gwas_1
#
# 0  1 
#88 12 
#
#$gwas_2
#
# 0  1 
#88 12 
#
#$gwas_3
#
# 0  1 
#88 12 

l1)

  • use lapply

一样,

  • 会将你所有的data.frames放入一个列表中

已经:比ifelse快大约15倍

代码语言:javascript
复制
#> set.seed(1337)
#> tmp<-data.frame(p = runif(99999999)*.007)
#> microbenchmark::microbenchmark(+(tmp[["p"]]<0.001) , ifelse(tmp[["p"]]<0.001, 1, 0), times = 4)
#Unit: milliseconds
#                             expr      min        lq     mean   median       uq      max neval cld
#            +(tmp[["p"]] < 0.001)  463.054  527.4309 1779.396 1440.110 3031.362 3774.312     4  a 
# ifelse(tmp[["p"]] < 0.001, 1, 0) 7071.470 7140.4354 8021.247 7887.672 8902.058 9238.173     4   b
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53413437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档