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,这将是一个很好的时间,我将编辑我的答案以澄清一点感谢您的详细解释。非常感谢。