在R中构建函数统计Tracking列同行出现的val值及次数
解决方法:找出共享Tracking行的val对及共同出现次数
首先咱们先把你的示例数据用代码还原出来,方便后续操作:
library(tibble) df <- tibble( val = c(36,36,36,36,18,18,1,7,7,7,7,7,20), Tracking = c(1,2,3,4,5,6,1,2,3,4,5,6,1) )
接下来我会用dplyr和tidyr包来实现需求,步骤很清晰:
- 整理每个val对应的Tracking集合:把每个val出现过的所有Tracking行号收集成列表,这样能快速知道每个val覆盖了哪些行。
- 生成所有不重复的val对:为了避免重复统计(比如(36,7)和(7,36)算同一对),我们只保留
val1 < val2的组合。 - 计算每个val对的共同Tracking数量:用
intersect()函数找出两个val的Tracking集合的交集,交集的长度就是它们共同出现的次数。
完整代码如下:
library(dplyr) library(tidyr) # 1. 提取每个val对应的所有Tracking行 val_trackings <- df %>% group_by(val) %>% summarise(trackings = list(unique(Tracking)), .groups = "drop") # 2. 生成所有不重复的val组合 val_pairs <- val_trackings %>% crossing(val_trackings, .name_repair = ~c("val1", "trackings1", "val2", "trackings2")) %>% filter(val1 < val2) # 3. 计算共同出现次数和对应的Tracking行 result <- val_pairs %>% mutate( common_count = map2_int(trackings1, trackings2, ~length(intersect(.x, .y))), common_trackings = map2(trackings1, trackings2, intersect) ) %>% select(val1, val2, common_count, common_trackings) # 查看最终结果 print(result)
运行后你会得到这样的结果:
# A tibble: 10 × 4 val1 val2 common_count common_trackings <dbl> <dbl> <int> <list> 1 1 7 1 <int [1]> 2 1 18 0 <int [0]> 3 1 20 1 <int [1]> 4 1 36 1 <int [1]> 5 7 18 2 <int [2]> 6 7 20 1 <int [1]> 7 7 36 4 <int [4]> 8 18 20 0 <int [0]> 9 18 36 0 <int [0]> 10 20 36 1 <int [1]>
比如你提到的36和7,它们共同出现在Tracking的1-4行,所以common_count是4,完全符合预期。如果某个val对没有共同的Tracking行,common_count就会是0,你也可以根据需求过滤掉这些行。要是不需要保留共同的Tracking行列表,只需要次数的话,把select里的common_trackings去掉就行。
内容的提问来源于stack exchange,提问作者Omry Atia
相关产品推荐
相关产品推荐

