Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:使用相互依赖的多个条件时避免循环_R_Loops_Apply - Fatal编程技术网

R:使用相互依赖的多个条件时避免循环

R:使用相互依赖的多个条件时避免循环,r,loops,apply,R,Loops,Apply,我不确定我的标题是否像我想的那样清晰。下面是使用循环编写的一些代码: for(i in 1:length(variantTable[,1])){ #N stores counts of numbers of population totals of populations that contain the variant in question N = 0 #NF.pop stores frequencies NF.EAS = 0 NF.AMR = 0 NF.EUR =

我不确定我的标题是否像我想的那样清晰。下面是使用循环编写的一些代码:

for(i in 1:length(variantTable[,1])){
  #N stores counts of numbers of population totals of populations that contain the variant in question
  N = 0
  #NF.pop stores frequencies
  NF.EAS = 0
  NF.AMR = 0
  NF.EUR = 0
  NF.SAS = 0
  if(variantTable[i,]$EAS_MAF > 0){
    NF.EAS = EAScount * variantTable[i,]$EAS_MAF
    N = N + EAScount
  }
  if(variantTable[i,]$AMR_MAF > 0){
    NF.AMR = AMRcount * variantTable[i,]$AMR_MAF
    N = N + AMRcount
  }
  if(variantTable[i,]$EUR_MAF > 0){
    NF.EUR = EURcount * variantTable[i,]$EUR_MAF
    N = N + EURcount
  }
  if(variantTable[i,]$SAS_MAF > 0){
    NF.SAS = SAScount * variantTable[i,]$SAS_MAF
    N = N + SAScount
  }
  variantTable[i,]$nonAFR_N <- N

  variantTable[i,]$nonAFR_weighted <- (NF.EAS + NF.AMR + NF.EUR + NF.SAS)/N
}
人口计数(EAScount、AMRcount等)之前已定义为:

EAScount <- length(variantTable$EAS_MAF[variantTable$EAS_MAF>0])
AMRcount <- length(variantTable$EAS_MAF[variantTable$AMR_MAF>0])
AFRcount <- length(variantTable$EAS_MAF[variantTable$AFR_MAF>0])
EURcount <- length(variantTable$EAS_MAF[variantTable$EUR_MAF>0])
SAScount <- length(variantTable$EAS_MAF[variantTable$SAS_MAF>0])
这样行吗

library(dplyr)
variantTable %>% mutate(
  NF.EAS = EAScount * EAS_MAF,
  NF.AMR = AMRcount * AMR_MAF,
  NF.EUR = EURcount * EUR_MAF,
  NF.SAS = SAScount * SAS_MAF,
  nonAFR_N = EAScount * (EAS_MAF>0) + AMRcount * (AMR_MAF>0) + EURcount * (EUR_MAF>0) + SAScount * (SAS_MAF>0),
  nonAFR_weighted = (NF.EAS + NF.AMR + NF.EUR + NF.SAS)/nonAFR_N) %>%
  select(-c(NF.EAS,NF.AMR,NF.EUR,NF.SAS))
mutate向表中添加或修改列,它允许使用不带
$
符号的列名。您的
if
结构是不必要的,因为通过乘以零,您将得到默认的零值,因此可以简化脚本的第一部分

当与算术运算符一起使用时,布尔值被强制转换为整数
0
1
,因此我也不需要所有
if
结构来计算
N

最后一个专栏非常简单

所有这些操作都是矢量化的,这意味着我直接加、减、乘、除列,而不是离散值,这对机器来说更快,对眼睛也更容易

此外,更高效、更易于阅读:

EAScount <- sum(variantTable$EAS_MAF>0)
AMRcount <- sum(variantTable$AMR_MAF>0)
AFRcount <- sum(variantTable$AFR_MAF>0)
EURcount <- sum(variantTable$EUR_MAF>0)
SAScount <- sum(variantTable$SAS_MAF>0)
EAScount 0)
AMRcount(0)
AFRcount(0)
欧元(0)
统计数字(0)
这样行吗

library(dplyr)
variantTable %>% mutate(
  NF.EAS = EAScount * EAS_MAF,
  NF.AMR = AMRcount * AMR_MAF,
  NF.EUR = EURcount * EUR_MAF,
  NF.SAS = SAScount * SAS_MAF,
  nonAFR_N = EAScount * (EAS_MAF>0) + AMRcount * (AMR_MAF>0) + EURcount * (EUR_MAF>0) + SAScount * (SAS_MAF>0),
  nonAFR_weighted = (NF.EAS + NF.AMR + NF.EUR + NF.SAS)/nonAFR_N) %>%
  select(-c(NF.EAS,NF.AMR,NF.EUR,NF.SAS))
mutate向表中添加或修改列,它允许使用不带
$
符号的列名。您的
if
结构是不必要的,因为通过乘以零,您将得到默认的零值,因此可以简化脚本的第一部分

当与算术运算符一起使用时,布尔值被强制转换为整数
0
1
,因此我也不需要所有
if
结构来计算
N

最后一个专栏非常简单

所有这些操作都是矢量化的,这意味着我直接加、减、乘、除列,而不是离散值,这对机器来说更快,对眼睛也更容易

此外,更高效、更易于阅读:

EAScount <- sum(variantTable$EAS_MAF>0)
AMRcount <- sum(variantTable$AMR_MAF>0)
AFRcount <- sum(variantTable$AFR_MAF>0)
EURcount <- sum(variantTable$EUR_MAF>0)
SAScount <- sum(variantTable$SAS_MAF>0)
EAScount 0)
AMRcount(0)
AFRcount(0)
欧元(0)
统计数字(0)

您可以使用apply进行此操作(我不确定您是否需要ifelse,因为else是什么都不做)。您能否提供一个可复制的数据示例?您只需
dput(head(variantTable))
并发布结果。我已经编辑了我的帖子,以包含dput。谢谢,不用担心。此外,EAScount、AMRcount、EURcount和SAScount是否在循环和常量之前定义?请提供一个示例,说明您希望结果的外观。如果我们也能看到这一点,那么提供解决方案可能会更快,即使您只计算第一行。我已经添加了有关EAScount等的详细信息,以及结果应该是什么样的示例。谢谢。你可以用apply来申请这个(我不确定你是否需要ifelse,因为else就是什么都不做)。您能否提供一个可复制的数据示例?您只需
dput(head(variantTable))
并发布结果。我已经编辑了我的帖子,以包含dput。谢谢,不用担心。此外,EAScount、AMRcount、EURcount和SAScount是否在循环和常量之前定义?请提供一个示例,说明您希望结果的外观。如果我们也能看到这一点,那么提供解决方案可能会更快,即使您只计算第一行。我已经添加了有关EAScount等的详细信息,以及结果应该是什么样的示例。谢谢,谢谢,这很有效,而且速度非常快。不过,我不完全确定你的回答是怎么回事?尤其是%>%?它被称为管道操作员,请尝试查找
dplyr
的教程,并在网站上阅读一些问题,如果您计划继续使用R,这将是一个很好的时间,我将编辑我的答案以澄清一点感谢您的详细解释。非常感谢。谢谢,这非常有效而且非常迅速。不过,我不完全确定你的回答是怎么回事?尤其是%>%?它被称为管道操作员,请尝试查找
dplyr
的教程,并在网站上阅读一些问题,如果您计划继续使用R,这将是一个很好的时间,我将编辑我的答案以澄清一点感谢您的详细解释。非常感谢。