Используя функцию table () из базы с dplyr pipe-синтаксисом? - PullRequest
2 голосов
/ 15 февраля 2020

Мне нравится синтаксис dplyr, но я борюсь с тем, чтобы легко получить таблицу сопряженности так же, как я могу получить с помощью функции base table (). table () в порядке, но я не могу понять, как включить его в синтаксис канала dplyr.

Спасибо за вашу помощь.

Вот несколько примеров данных, к которым я пытаюсь добраться.

df <- tibble(id=c(rep("A",100),rep("B",100),rep("C",100)),
               val=c(rnorm(300,mean=500,sd=100))) %>%
  mutate(val_bin=cut(val,breaks=5))

table(df$id,df$val_bin)

Вывод:

    (210,325] (325,440] (440,554] (554,669] (669,784]
  A         4        22        55        18         1
  B         6        19        46        24         5
  C         3        23        44        22         8

Ответы [ 2 ]

3 голосов
/ 15 февраля 2020

Один из вариантов - использовать with:

df %>%
  with(., table(id, val_bin))
#    val_bin
# id  (228,327] (327,426] (426,525] (525,624] (624,723]
#   A         4        19        39        22        16
#   B         5        15        41        32         7
#   C         5        14        44        25        12

Технически, . не требуется,

df %>%
  with(table(id, val_bin))

, но я нахожу, что это немного яснее в ситуации, когда может быть легко перепутать, куда идут данные (в пределах with или table). (Подсказка: это почти всегда первая функция, with здесь.)

2 голосов
/ 15 февраля 2020

Мы можем select интересующие столбцы и применить table

library(dplyr)
df %>% 
    select(id, val_bin) %>%
    table

Или другой вариант - заключить в {}

df %>%
    {table(.$id, .$val_bin)}

В tidyverse немного сложнее получить требуемый вывод

library(dplyr)
library(tidyr)
df %>%
   count(id, val_bin) %>%
   pivot_wider(names_from = val_bin, values_from = n, values_fill = list(n = 0)) %>%
   column_to_rownames('id')
#   (214,338] (338,461] (461,584] (584,707] (707,831]
#A         5        30        44        20         1
#B         9        30        34        27         0
#C         8        28        43        20         1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...