gpt4 book ai didi

r - 使用 R 按因子水平查找重叠范围

转载 作者:行者123 更新时间:2023-12-02 02:46:17 26 4
gpt4 key购买 nike

我需要在单个数据集中找到重叠范围,但需要为每个 ID 或因子级别找到它们。任何援助将不胜感激!

    library(dplyr)

df_foo = read.table(
textConnection("Class Min Max
A 500 630
A 100 200
B 100 200
A 210 310
A 200 210
B 210 310
A 510 530
B 200 210
A 705 800
B 500 630
B 510 530
B 705 800"), header = TRUE
)

c = outer(df_foo$Max, df_foo$Min, ">")
d = outer(df_foo$Min, df_foo$Max, "<")

df_foo %>%
mutate(Overlap = apply(c & d, 1, sum) > 1
)

我得到的结果如下:
   Class Min Max Overlap
1 A 500 630 TRUE
2 A 100 200 TRUE
3 B 100 200 TRUE
4 A 210 310 TRUE
5 A 200 210 TRUE
6 B 210 310 TRUE
7 A 510 530 TRUE
8 B 200 210 TRUE
9 A 705 800 TRUE
10 B 500 630 TRUE
11 B 510 530 TRUE
12 B 705 800 TRUE

但我想像这样找到 A 和 B 的每个级别之间的重叠:
   Class Min Max Overlap
1 A 500 630 TRUE
2 A 100 200 FALSE
3 B 100 200 FALSE
4 A 210 310 FALSE
5 A 200 210 FALSE
6 B 210 310 FALSE
7 A 510 530 TRUE
8 B 200 210 FALSE
9 A 705 800 FALSE
10 B 500 630 TRUE
11 B 510 530 TRUE
12 B 705 800 FALSE

最佳答案

我在data.table有答案,翻译成dplyr应该是直截了当的。这个想法是为每个类创建一个先前累积最大值的向量:

df_foo <- setDT(df_foo)
df_foo[, shiftedmaxmax := c(NA,cummax(Max)[1:(.N-1)]),by = Class ]


Class Min Max shiftedmaxmax
1: A 100 200 NA
2: A 200 210 200
3: A 210 310 210
4: A 500 630 310
5: A 510 530 630
6: A 705 800 630
7: B 100 200 NA
8: B 200 210 200
9: B 210 310 210
10: B 500 630 310
11: B 510 530 630
12: B 705 800 630

并将最小值与Maximum的先前最大值进行比较(因此如果它低于此值,则当前行在前一行的范围内)
df_foo[,superposed := Min < shiftedmaxmax]

Class Min Max shiftedmaxmax superposed
1: A 100 200 NA NA
2: A 200 210 200 FALSE
3: A 210 310 210 FALSE
4: A 500 630 310 FALSE
5: A 510 530 630 TRUE
6: A 705 800 630 FALSE
7: B 100 200 NA NA
8: B 200 210 200 FALSE
9: B 210 310 210 FALSE
10: B 500 630 310 FALSE
11: B 510 530 630 TRUE
12: B 705 800 630 FALSE

缺少第一个叠加,可以这样获取:
df_foo[,superposedsource :=  Max %in% shiftedmaxmax[superposed],by = Class]
df_foo[,superposedtot := ifelse((superposed | superposedsource) &,T,F)]

Class Min Max shiftedmaxmax superposed superposedsource superposedtot
1: A 100 200 NA NA FALSE NA
2: A 200 210 200 FALSE FALSE FALSE
3: A 210 310 210 FALSE FALSE FALSE
4: A 500 630 310 FALSE TRUE TRUE
5: A 510 530 630 TRUE FALSE TRUE
6: A 705 800 630 FALSE FALSE FALSE
7: B 100 200 NA NA FALSE NA
8: B 200 210 200 FALSE FALSE FALSE
9: B 210 310 210 FALSE FALSE FALSE
10: B 500 630 310 FALSE TRUE TRUE
11: B 510 530 630 TRUE FALSE TRUE
12: B 705 800 630 FALSE FALSE FALSE

关于r - 使用 R 按因子水平查找重叠范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54810029/

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