R извлекая частоты - PullRequest
       26

R извлекая частоты

1 голос
/ 09 июля 2019

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

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

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

Ответы [ 4 ]

2 голосов
/ 09 июля 2019

Идея от @IceCreamToucan с dplyr:

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

  gender  freq
  <fct>  <int>
1 f          1
2 m          2
2 голосов
/ 09 июля 2019

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

library(data.table)
setDT(data)

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

#    gender Freq
# 1:      m    2
# 2:      f    1
1 голос
/ 12 июля 2019

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

В базе R я бы

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

Итак, код

table(data[duplicated(data$id), "gender"])
f m 
1 2
1 голос
/ 09 июля 2019

В базе R

rowSums(table(data$gender,data$id)!=0)
f m 
1 2 
...