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

时间:2019-01-07 23:04:14

标签: r dplyr combinations division

我的数据如下:

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来说似乎有点复杂。

1 个答案:

答案 0 :(得分:3)

评论似乎可以帮助您达到目标。这是一个dplyr解决方案。使用left_join,每个密度1都与同一集合中的所有密度3匹配,从而提供符合您的规格的输出。

# 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