R извлечение частот

Я пытаюсь получить частоты, но мои идентификаторы повторяются. Вот пример данных:

id <- c(1,1,2,2,3,3)
gender <- c("m","m","f","f","m","m")
score <- c(10,5,10,5,10,5)
data <- data.frame("id"=id,"gender"=gender, "score"=score)

> data
  id gender score
1  1      m    10
2  1      m     5
3  2      f    10
4  2      f     5
5  3      m    10
6  3      m     5

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

gender<-as.data.frame(table(data$gender))
> gender
  Var1 Freq
1    f    2
2    m    4

Частота должна быть: женский = 1, мужской = 2. это должно выглядеть так:

> gender
  Var1 Freq
1    f    1
2    m    2

Как я могу получить это, учитывая информацию об идентификаторе?


person amisos55    schedule 09.07.2019    source источник
comment
Сначала вам нужно однозначно идентифицировать комбинации идентификатора и пола. Тогда сделайте свой стол. Вот один способ: table(unique(data[ , c("id", "gender"))$gender)   -  person DanY    schedule 09.07.2019


Ответы (4)


В базе R

rowSums(table(data$gender,data$id)!=0)
f m 
1 2 
person BENY    schedule 09.07.2019

Вы можете использовать data.table::uniqueN для подсчета количества уникальных идентификаторов для каждой гендерной группы.

library(data.table)
setDT(data)

data[, .(Freq = uniqueN(id)), gender]

#    gender Freq
# 1:      m    2
# 2:      f    1
person IceCreamToucan    schedule 09.07.2019

Идея от @IceCreamToucan с dplyr:

data %>%
 group_by(gender) %>%
 summarise(freq = n_distinct(id))

  gender  freq
  <fct>  <int>
1 f          1
2 m          2
person tmfmnk    schedule 09.07.2019
comment
по какой-то причине я получаю общую частоту, а не частоту для каждой категории с вашим кодом. - person amisos55; 09.07.2019
comment
Это странно. Попробуйте обновить dplyr до последней версии. - person tmfmnk; 09.07.2019

Опоздав на вечеринку, я был весьма удивлен сложными ответами, в которых используется группировка или rowSums().

В базе R я бы

  1. удалите повторяющиеся id строки из data.frame, разделив их на duplicated(id),
  2. примените table() к столбцу gender.

Итак, код

table(data[duplicated(data$id), "gender"])
f m 
1 2
person Uwe    schedule 12.07.2019