我有一个包含用户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)))
这是对的吗?
答案 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 = ",")