цикл ifelse для нескольких фреймов данных - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу создать цикл для повторения строк кода в списке наборов данных.Каждый набор данных выглядит следующим образом:

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 голосов
/ 21 ноября 2018

Попробуйте:

настроить данные:

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)))

результат:

#$gwas_1
#
# 0  1 
#88 12 
#
#$gwas_2
#
# 0  1 
#88 12 
#
#$gwas_3
#
# 0  1 
#88 12 

  • поместите все ваши data.frames в список (например, l1)
  • уже используйте lapply

: в 15 раз быстрее, чем ifelse

#> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...