gpt4 book ai didi

r - 如何找到一列中与另一个数据框的范围匹配的单元格数?

转载 作者:行者123 更新时间:2023-12-01 13:47:33 26 4
gpt4 key购买 nike

我有一个像这样的 data.frame1:

Input_SNP_CHR   Input_SNP_BP     Set_1_CHR   Set_1_BP     Set_2_CHR   Set_2_BP     Set_3_CHR   Set_3_BP
chr4 184648954 chr18 63760782 chr7 135798891 chr7 91206783
chr13 45801432 chr14 52254555 chr1 223293324 chr4 184648954
chr18 71883393 chr22 50428069 chr7 138698825 chr18 63760782

我有另一个 data.frame2 像:

CHR     BP1             BP2             Score   Value
chr1 29123222 29454711 -5.7648 599
chr13 45799118 45986770 -4.8403 473
chr5 46327104 46490961 -5.3036 536
chr6 50780759 51008404 -4.4165 415
chr18 63634657 63864734 -4.8096 469
chr1 77825305 78062178 -5.4671 559

我想找出 data.frame1 中每对(一对是 Input_SNP_CHR 和 Input_SNP_BP)中有多少行都匹配一个 CHR 并落在 data.frame2 的 BP1 和 BP2 之间。例如,在我的第一对(Input_SNP 对)中,我有一个匹配项。这是第二行,其中 Input_SNP 的 CHR (chr13) 和 BP (45801432) 与 data.frame2 中的 CHR (chr13) 和 BP 范围(45799118 和 45986770 之间)匹配的一行。对于我的第二对(Set_1 对),我也有 1 个匹配项 (chr18) 和 BP 63760782 通过 chr18 和 BP 范围与 data.frame2 的第 5 行匹配。

我想要的输出是:

Input_SNP     Set_1     Set_2     Set_3
1 1 0 1

我将如何在 R 中执行此操作?

最佳答案

这是使用 data.table 的另一种可能的解决方案。首先我们将数据melt成long格式,根据第一个df列名添加一个Set列,然后运行foverlaps 结合 table 以检查频率

library(data.table) # v 1.9.6+
Ldf <- melt(setDT(df), measure = patterns("CHR", "BP")) # Create a column for BP and CHR
Names <- unique(sub("(.*_.*)_.*", "\\1", names(df))) # Creates a sets names indx
setnames(Ldf[, variable := factor(Names[variable])], c("Set", "CHR", "BP1")) # Rename
Ldf[, BP2 := BP1] # Creating right boundary for foverlaps
setkeyv(Ldf, names(Ldf)[-1]) # Keying for foverlaps
table(foverlaps(setDT(df2), Ldf, nomatch = 0L)$Set) # Running fovelaps and checking freqs
# Input_SNP Set_1 Set_2 Set_3
# 1 1 0 1

关于r - 如何找到一列中与另一个数据框的范围匹配的单元格数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34784098/

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