Как подсчитать количество строк в кадре данных независимо от порядка элементов? - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь посчитать количество строк символов с определенной группировкой элементов, независимо от их порядка. Я видел некоторые ответы, в которых обсуждается, как их удалить или как узнать, равны ли они друг другу, но мне нужно их количество.

Пример набора данных (вещи упакованы для путешествий):

Person    Month    Item
Adam        1      Shoe
Adam        1       Hat
Frank       1       Hat
Frank       1       Shoe 

Я использую packing <- group_by(Person, Month) %>% summarise_all(funs(toString(unique(.)))), чтобы получить

Person     Month    Item
Adam        1       Shoe, Hat
Frank       1       Hat, Shoe

Тогда я использую grouped_packing <- packing %>% group_by(Item) %>% summarise(count=n())

R дает мне счет 1 для каждого списка, когда на самом деле я хочу, чтобы он проигнорировал порядок и сказал, что у меня есть 2 из этого списка. Как я могу это сделать?

РЕДАКТИРОВАТЬ: Добавление дополнительных данных

Person    Month    Item
Adam        1      Shoe
Adam        1       Hat
Frank       1       Hat
Frank       1       Shoe
Sally       2       Shoe
Sally       2       Hat
Sally       2       Shoe
Sally       2       Hat
Jen         3       Belt
Jen         4       Belt 

Группировать:

Person     Month    Item
Adam        1       Shoe, Hat
Frank       1       Hat, Shoe
Sally       2       Shoe, Hat
Sally       2       Shoe, Hat
Jen         3       Belt
Jen         3       Belt

Я хочу получить результат:

Item Groups     N
Shoe, Hat       4
Belt            2

Изменит ли это подход?

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

В строке ответа @ NelsonGon, используя n(), перед подсчетом вы захотите посчитать:

library(tidyverse)

packing <- tribble(
  ~Person,    ~Month,    ~Item,
  "Adam",        1,       "Shoe",
  "Adam",        1,       "Hat",
  "Frank",       1,       "Hat",
  "Frank",       1,       "Shoe" 
)

packing %>% 
  group_by(Person, Month) %>% 
  summarise_all(funs(N = n(), Item = toString(unique(.))))

# A tibble: 2 x 4
# Groups:   Person [?]
  Person Month     N Item     
  <chr>  <dbl> <int> <chr>    
1 Adam       1     2 Shoe, Hat
2 Frank      1     2 Hat, Shoe

За проницательный комментарий @ IceCreamToucan, если ваш Items в каждом Personи Month не являются уникальными, вы можете получить результат, который на N больше, чем кажущаяся длина вашего списка элементов, разделенных запятыми (из-за отсутствия лучшего термина).Вы можете использовать N = length(unique(.)), чтобы избежать этого.

Чтобы ответить на ваш отредактированный вопрос:

packing %>% 
  group_by(Person, Month) %>% 
  arrange(Item) %>%
  summarise_all(funs(N = n(), Item = toString(unique(.)))) %>%
  ungroup %>% group_by(Item) %>%
  summarize(N = n())

# A tibble: 2 x 2
  Item          N
  <chr>     <int>
1 Belt          2
2 Hat, Shoe     3

Сначала вам нужно будет отсортировать по arrange, чтобы избежать того же списка.переставлять разные способы.Затем удалите оставшуюся группировку, перегруппируйте ее с помощью Item и суммируйте соответствующим образом.

Кроме того, «список» - это очень особенное слово в R, поэтому путаница перед вашим первоначальным редактированием.Возможно, стоит почитать этот раздел из книги Хэдли Уикхема R для Data Science , если вы хотите продолжить исследование.

0 голосов
/ 10 апреля 2019

Вот одно решение, использующее tapply() из базы R

attach(packing)  # attach the data frame
tapply(Item, list(Person, Month), function(x) length(unique(x)))

      1
Adam  2
Frank 2
0 голосов
/ 10 апреля 2019

Попробуйте использовать mutate вместо summarise:

df1 %>% 
   group_by(Item,Month) %>% 
 mutate(N=n())

# A tibble: 4 x 4
# Groups:   Item, Month [2]
  Person Month Item      N
  <chr>  <int> <chr> <int>
1 Adam       1 Shoe      2
2 Adam       1 Hat       2
3 Frank      1 Hat       2
4 Frank      1 Shoe      2
...