R 中具有百分比的分类变量 Table
Categorical Variables Table with Percentages in R
我有一系列具有响应选项(有利、不利、中性)的分类变量。
我想在 R 中创建一个 table,它将在行中给出所有 10 个变量的列表(每行一个变量)- 列中有百分比响应 "Favorable, Unfavorable, Neutral"。这在 R 中可能吗?理想情况下,我还希望能够通过另一个分类变量对其进行分组(例如,比较男性和女性对问题的不同反应)。
如果您提供实际数据的样本,您会得到更好的答案(参见 this post)。也就是说,这是一个使用 dplyr::
(和 reshape2::melt
)的解决方案。
# function to create a column of fake data
make_var <- function(n=100) sample(c("good","bad","ugly"), size=n, replace=TRUE)
# put ten of them together
dat <- as.data.frame(replicate(10, make_var()), stringsAsFactors=FALSE)
library("dplyr")
# then reshape to long format, group, and summarize --
dat %>% reshape2::melt(NULL) %>% group_by(variable) %>% summarize(
good_pct = (sum(value=="good") / length(value)) * 100,
bad_pct = (sum(value=="bad") / length(value)) * 100,
ugly_pct = (sum(value=="ugly") / length(value)) * 100
)
请注意,要按另一列(例如性别)分组,您可以在汇总之前说 group_by(variable, sex)
(只要 sex
是数据的一列,而不是case 在这个构造的例子中)。
改编 lefft
的示例,但尝试执行 dplyr
中的所有内容:
dat %>%
gather(variable, value) %>%
group_by(variable) %>%
count(value) %>%
mutate(pct = n / sum(n) * 100) %>%
select(-n) %>%
spread(value, pct)
我有一系列具有响应选项(有利、不利、中性)的分类变量。
我想在 R 中创建一个 table,它将在行中给出所有 10 个变量的列表(每行一个变量)- 列中有百分比响应 "Favorable, Unfavorable, Neutral"。这在 R 中可能吗?理想情况下,我还希望能够通过另一个分类变量对其进行分组(例如,比较男性和女性对问题的不同反应)。
如果您提供实际数据的样本,您会得到更好的答案(参见 this post)。也就是说,这是一个使用 dplyr::
(和 reshape2::melt
)的解决方案。
# function to create a column of fake data
make_var <- function(n=100) sample(c("good","bad","ugly"), size=n, replace=TRUE)
# put ten of them together
dat <- as.data.frame(replicate(10, make_var()), stringsAsFactors=FALSE)
library("dplyr")
# then reshape to long format, group, and summarize --
dat %>% reshape2::melt(NULL) %>% group_by(variable) %>% summarize(
good_pct = (sum(value=="good") / length(value)) * 100,
bad_pct = (sum(value=="bad") / length(value)) * 100,
ugly_pct = (sum(value=="ugly") / length(value)) * 100
)
请注意,要按另一列(例如性别)分组,您可以在汇总之前说 group_by(variable, sex)
(只要 sex
是数据的一列,而不是case 在这个构造的例子中)。
改编 lefft
的示例,但尝试执行 dplyr
中的所有内容:
dat %>%
gather(variable, value) %>%
group_by(variable) %>%
count(value) %>%
mutate(pct = n / sum(n) * 100) %>%
select(-n) %>%
spread(value, pct)