计算与唯一用户对应的响应的均值和中值

时间:2018-01-05 03:30:15

标签: r dplyr

我有一个包含用户ID,文本响应和一些其他变量的数据框。对于用户,一些文本响应是空白的。我想计算平均响应数/用户数,响应/用户的中位数和平均值的标准偏差。我想使用基本R函数或dplyr库来执行此操作。解决这个问题的最佳方法是什么?

userid, text
1,      abc
1,  
1,      abcd
1,  
1,      asdf
1,      
2,      text2
2,      text3
3,      text4
3,      
3,      text5

对于平均值,我刚做sum(df$text != '')/(length(unique(df$userid))) 这是对的吗?

2 个答案:

答案 0 :(得分:1)

对这种平均值,中位数和&值更敏感的数据结构sd计算是重新编码""进入NAs(如果""表示来自受访者的无答案),那么data.frame将如此:

data <- data.frame(userid = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), 
                text = c("abc", NA, "abcd", NA, "asdf", NA, "text2", "text3", "text4", NA, "text5"))

这可以通过重新编码来实现&#34;&#34;进入NAs,如

df$text[df$text==""] <- NA

然后你可以聚合你的数据(基数R):

aggregation <- aggregate(text~userid, data, length)
#  userid text
#1      1    3
#2      2    2
#3      3    2

并计算统计数据

sapply(list(mean=mean , median=median, sd=sd), function(i) i(aggregation$text))
#     mean    median        sd 
#2.3333333 2.0000000 0.5773503 

希望这有帮助!

答案 1 :(得分:0)

如果您正在考虑计算响应,则应考虑边缘情况,例如响应文本只是一串空白,您不希望将其视为响应。您还应该防止文本响应在数据中根本不存在的可能性 - 可能是R中的NULL值,尽管您没有在您的伪造数据中显示任何值。

我还建议使用一步一步的方法,如果您想查看例如您有多少回复,则可以在生成摘要结果之前验证计数。

一个dplyr示例:

library(dplyr)

group_by(df, userid) %>%
  summarise(nresponses = 
              sum(case_when(is.null(text) ~ 0, 
                            nchar(trimws(text))==0 ~ 0,
                            TRUE ~ 1  ))) %>%
  summarise(respondents = n(), 
            mean = mean(nresponses), 
            median = median(nresponses),
            sd = sd(nresponses))

# A tibble: 1 x 4
  respondents     mean median        sd
        <int>    <dbl>  <dbl>     <dbl>
1           3 2.333333      2 0.5773503

如果我执行第一个汇总语句以进行检查,您将看到中间计数,然后在第二个语句中进行汇总:

> group_by(df, userid) %>%
+   summarise(nresponses = 
+               sum(case_when(is.null(text) ~ 0, 
+                             nchar(trimws(text))==0 ~ 0,
+                             TRUE ~ 1  )))

    # A tibble: 3 x 2
      userid nresponses
       <int>      <dbl>
    1      1          3
    2      2          2
    3      3          2

在我看来,当您使用真实数据而不是几条补充线时,必须能够回过头来验证您获得结果的方式。

您问题的数据:

df = read.table(text = "userid, text
1,      abc
1,  
1,      abcd
1,  
1,      asdf
1,      
2,      text2
2,      text3
3,      text4
3,      
3,      text5", header = TRUE, stringsAsFactors = FALSE, sep = ",")