2015-08-12 3 views
2

У меня есть кадр данных в формате, как показано ниже:получить стандартное отклонение от групп в кадре данных

user <- c(1,1,2,2,2,2,3,3,3) 
answer_num <- c(1,2,3,3,4,4,5,5,6) 
df <- data.frame(user,answer_num) 

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

library(dplyr) 
df %>% group_by(user) %>% summarise(inst_per_answer = n()/length(unique(answer_num))) 

, который дает мне:

user inst_per_answer 
1 1   1.0 
2 2   2.0 
3 3   1.5 

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

Разъяснение:
Я ищу стандартное отклонение количества экземпляров каждого ответа. Например, пользователь 1 имеет 1 экземпляр ответа 1 и 1 экземпляр ответа 2. Поэтому стандартное отклонение составляет 0 - sd(c(1,1)). Пользователь 3 имеет 2 экземпляра ответа 5 и 1 экземпляр ответа 6, для sd 0,7 - sd(c(2,1)).

+1

нет сд от одного числа, но вы можете сделать 'sd (answer_num)' – jenesaisquoi

+0

@RichardScriven oh он хочет g через группы? вы должны опубликовать его – jenesaisquoi

+0

Это, кажется, не дает мне правильного ответа –

ответ

3

Попробуйте это возможно

df %>% 
    group_by(user, answer_num) %>% 
    summarise(n = n()) %>% 
    summarise(sd_per_user = sd(n)) 

# Source: local data frame [3 x 2] 
# 
# user sd_per_user 
# 1 1 0.0000000 
# 2 2 0.0000000 
# 3 3 0.7071068 

Или сокращенный вариант

df %>% 
    count(user, answer_num) %>% 
    summarise(sd_per_user = sd(n)) 

# Source: local data frame [3 x 2] 
# 
# user sd_per_user 
# 1 1 0.0000000 
# 2 2 0.0000000 
# 3 3 0.7071068 

или версию data.table (используя @Thelas основание R идея)

library(data.table) 
setDT(df)[, .(sd_per_user = sd(table(answer_num))), by = user] 
# user sd_per_user 
# 1: 1 0.0000000 
# 2: 2 0.0000000 
# 3: 3 0.7071068 
1

Для тех, кто заинтересован в sqldf, два варианта:

RSQLite STDEV:

library(sqldf) 
sqldf("SELECT user, STDEV(n) AS sd 
     FROM (SELECT user, answer_num, count(answer_num) AS n 
     FROM df GROUP BY user,answer_num) 
     GROUP BY user") 

rH2, STDDEV или STDDEV_SAMP:

library(RH2) 
sqldf("SELECT user, STDDEV(n) AS sd 
     FROM (SELECT user, answer_num, COUNT(answer_num) AS n 
      FROM df GROUP BY user,answer_num) 
     GROUP BY user") 

Выход:

user  sd 
1 1 0.0000000 
2 2 0.0000000 
3 3 0.7071068 
+0

' stdev' работает с RSQLite и 'stddev_samp' с RH2. –

+0

@ G. Гротендик Я включил это различие. не совсем уверен, что STDDEV и STDDEV_SAMP взаимозаменяемы в H2. Согласно этому веб-сайту это выглядит так: http://www.h2database.com/html/functions.html#stddev_samp – mpalanco

+0

Да, в H2 'STDDEV' является псевдонимом для' STDDEV_SAMP' ,Фактически это: 'sqldf (« select stddev (demand) from BOD »)' будет использовать 'STDDEV_SAMP' в заголовке, а не' STDDEV', поэтому кажется, что 'stddev' работает как с sqlite, так и с h2. –

Смежные вопросы