#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))