在 R 中划分给定子数据中的所有可能行

Dividing all possible rows within a given sub-data in R

我的数据是这样的:

set <- c(1,1,1,2,2,3,3,3,3,3,4,4)
density <- c(1,3,3,1,3,1,1,1,3,3,1,3)
counts <- c(100,2,4,76,33,12,44,13,54,36,65,1)
data <- data.frame(set,density,counts)
data$set <- as.factor(data$set)
data$density <- as.factor(data$density)

在给定的集合中,有两个级别的密度“1”或“3”。对于给定的集合,我想划分所有可能的密度“1”和密度“3”的组合。然后我想打印与密度“1”相关的原始密度、比率和集合

例如,前几行的结果应如下所示:

 set counts ratio
  1   100    50  #100/2
  1   100    25  #100/4
  2   76     2.3 #76/33
  3   12     0.22 #12/54
  3   12     0.33 #12/36
  3   44     0.8148 #44/54
 ...

我以为我可以通过 dplyr 实现它..但是对于 dplyr 来说它似乎有点太复杂了。

看起来这些评论让您了解了大部分内容。这是 dplyr 解决方案。 left_join 每个 density1 都与同一组中的所有 density3 匹配,提供符合您的规范的输出。

# Edited below to use dplyr syntax; my base syntax had a typo

library(dplyr)
data_combined <- data %>% filter(density == 1) %>%
   # Match each 1 w/ each 3 in the set
   left_join(data %>% filter(density == 3), by = "set") %>%  
   mutate(ratio = counts.x / counts.y) %>%
   select(set, counts.x, counts.y, ratio)

data_combined
#   set counts.x counts.y      ratio
#1    1      100        2 50.0000000
#2    1      100        4 25.0000000
#3    2       76       33  2.3030303
#4    3       12       54  0.2222222
#5    3       12       36  0.3333333
#6    3       44       54  0.8148148
#7    3       44       36  1.2222222
#8    3       13       54  0.2407407
#9    3       13       36  0.3611111
#10   4       65        1 65.0000000