Деление всех возможных строк в данных суб-данных в R - PullRequest
0 голосов
/ 08 января 2019

Мои данные выглядят так:

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 голосов
/ 08 января 2019

Похоже, комментарии дадут вам большую часть пути туда. Вот решение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...