Почему я получаю сообщение об ошибке при попытке получить подсчет по 2 переменным в R?

#r #count #runtime-error

#r #количество #время выполнения-ошибка

Вопрос:

Я пытаюсь выполнить подсчет частоты по 2 переменным. Это мои данные в dataframe «api»:

       Name          Grade
1     John Smith    C     
2     John Smith    B       
3     John Smith    C      
4     Jane Doe      A     
5     Jane Doe      C     
6     Lisa Brown    B  
  

Я хочу это:

       Name          Grade   Freq
1     John Smith    C       2    
2     John Smith    B       1  
3     John Smith    C       2 
4     Jane Doe      A       1 
5     Jane Doe      C       1   
6     Lisa Brown    B       1   
  

Это мой код:

 api_count<-count(api, c("Name", "Grade")
  

И я получаю это сообщение об ошибке:

 Error: Problem with `mutate()` input `..1`.
x Input `..1` can't be recycled to size 28328.
i Input `..1` is `c("Name", "Grade")`.
i Input `..1` must be size 28328 or 1, not 2.
  

Комментарии:

1. Как насчет api %>% group_by(Name, Grade) %>% mutate(Freq = n()) . Не могли бы вы dput свой api фрейм данных, чтобы было проще проверить, сработает ли это?

Ответ №1:

Я бы предложил такой tidyverse подход:

 library(tidyverse)
#Code
df %>% group_by(Name,Grade) %>% mutate(N=n())
  

Вывод:

 # A tibble: 6 x 3
# Groups:   Name, Grade [5]
  Name       Grade     N
  <chr>      <chr> <int>
1 John Smith C         2
2 John Smith B         1
3 John Smith C         2
4 Jane Doe   A         1
5 Jane Doe   C         1
6 Lisa Brown B         1
  

Некоторые используемые данные:

 #Data
df <- structure(list(Name = c("John Smith", "John Smith", "John Smith", 
"Jane Doe", "Jane Doe", "Lisa Brown"), Grade = c("C", "B", "C", 
"A", "C", "B")), class = "data.frame", row.names = c(NA, -6L))
  

Комментарии:

1. Это сработало, спасибо! Но есть ли у вас какие-либо идеи, что может быть не так с count? Действительно кажется, что это должно дать тот же результат.

2. @M1245689 Большое спасибо, возможно, это из-за структуры данных, некоторые функции допускают векторы вместо фреймов данных, поэтому я подозреваю, что проблема связана с этим!

Ответ №2:

Я думаю, что ваш код в основном правильный, только некоторые незначительные проблемы с синтаксисом:

 api <- data.frame(Name = c(rep("John Smith",3), rep("Jane Doe", 2), "Lisa Brown"), Grade = c("C", "B", "C", "A", "C","B")))
api
   Name Grade
1 John Smith     C
2 John Smith     B
3 John Smith     C
4   Jane Doe     A
5   Jane Doe     C
6 Lisa Brown     B

count(api, c("Name", "Grade"))
        Name Grade freq
1   Jane Doe     A    1
2   Jane Doe     C    1
3 John Smith     B    1
4 John Smith     C    2
5 Lisa Brown     B    1
  

Комментарии:

1. Я забыл прописать переменные в count в этом сообщении и вернулся и отредактировал, но они всегда были прописными в моем коде

Ответ №3:

Я думаю, что @Duck — это самый прямой подход (и предпочтительный; и с этими данными — половина времени вычисления), но вот альтернатива на случай, если это имеет больше смысла: count а затем join вернуться с исходными данными:

 df %>%
  count(Name, Grade) %>%
  left_join(df, ., by = c("Name", "Grade"))
#         Name Grade n
# 1 John Smith     C 2
# 2 John Smith     B 1
# 3 John Smith     C 2
# 4   Jane Doe     A 1
# 5   Jane Doe     C 1
# 6 Lisa Brown     B 1
  

Комментарии:

1. Это тоже работает! Есть ли простой способ превратить значения Grade в переменные? Так что результат будет: Name ABC John Smith 012

2. Посмотрите tidyr::pivot_wider , но у вас проблема, когда Smith / C имеет два значения …

Ответ №4:

Мы можем использовать add_count

 library(dplyr)
df %>% 
  add_count(Name, Grade)
#        Name Grade n
#1 John Smith     C 2
#2 John Smith     B 1
#3 John Smith     C 2
#4   Jane Doe     A 1
#5   Jane Doe     C 1
#6 Lisa Brown     B 1
  

данные

 df <- structure(list(Name = c("John Smith", "John Smith", "John Smith", 
"Jane Doe", "Jane Doe", "Lisa Brown"), Grade = c("C", "B", "C", 
"A", "C", "B")), class = "data.frame", row.names = c(NA, -6L))