gpt4 book ai didi

r - 如何根据R中其他列中的数据有条件地执行减法?

转载 作者:行者123 更新时间:2023-12-04 10:57:49 24 4
gpt4 key购买 nike

我有一个数据集,用于计算基因之间的距离。这涉及从当前行的“bp.snp”列中减去下面一个基因行的“bp.snp”列,以给出当前行/基因与下一行的距离。

但是,对于新染色体的每次开始,我都不想执行减法,我如何在 for 循环中考虑到这一点?

我的数据如下所示:

Gene  Chromosome  bp.snp  
ACE 1 1
NOTCH 1 2
BRCA 1 3
HER 2 7000
GABA 2 7001
P53 3 20000
APX1 3 20001

我希望输出列如下所示:
Gene  Chromosome  bp.snp   distance
ACE 1 1 1
NOTCH 1 2 1
BRCA 1 3 0/NA
HER 2 7000 1
GABA 2 7001 0/NA
P53 3 20000 1
APX1 3 20001 1

所以它忽略了每次染色体变化时执行 bp.snp 减法。

我的代码目前是这样的:
df$distance <- NA
for(i in 1:(nrow(df) - 1)) {
df$distance[i] = df$bp.snp1[i+1] - df$bp.snp1[i]}

我不知道如何开始基本上要求代码做“每次染色体列增加 1 时不执行循环中的减法”

最佳答案

您可以使用 avediff计算每 Chromosome 的距离.

df$distance  <- ave(df$bp.snp, df$Chromosome, FUN=function(x) c(diff(x), NA))
df
# Gene Chromosome bp.snp distance
#1 ACE 1 1 1
#2 NOTCH 1 2 1
#3 BRCA 1 3 NA
#4 HER 2 7000 1
#5 GABA 2 7001 NA
#6 P53 3 20000 1
#7 APX1 3 20001 NA

或者您只需计算所有差异并将其设置为 NA , 在您有差异的地方 Chromosome .
df$distance <- c(diff(df$bp.snp), NA)
df$distance[c(diff(df$Chromosome) > 0, FALSE)] <- NA
# Gene Chromosome bp.snp distance
#1 ACE 1 1 1
#2 NOTCH 1 2 1
#3 BRCA 1 3 NA
#4 HER 2 7000 1
#5 GABA 2 7001 NA
#6 P53 3 20000 1
#7 APX1 3 20001 NA

关于r - 如何根据R中其他列中的数据有条件地执行减法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59073301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com