2

我是R新手,不知何故,这个问题似乎应该很容易解决。但不幸的是,经过大约三天的搜索和试验,我还没有做到这一点。

我的数据格式接近宽格式:

color   agegroup    sex     ses
red     2           Female  A
blue    2           Female  C
green   5           Male    D
red     3           Female  A
red     2           Male    B
blue    1           Female  B
...

我正在尝试使用由和组织的因变量(此处)的计数和百分比创建可呈现的表格。我需要一个按每个组织的表格,百分比旁边有计数,如下所示:colorsexsesagegroupsessexagegroup

agegroup:                                  1
sex:                  Female                               Male
ses:        A       B       C       D           A       B       C       D
color:
red         2 1%    0  0%   8 4%    22 11%      16 8%   2   1%  8   4%  3 1.5%
blue        9 4.5%  6  3%   4 2%    2  1%       12 6%   32 16%  14  7%  6   3%
green       4 2%    12 6%   2 1%    8  4%       0  0%   22 11%  40 20%  0   0%

agegroup:                               2
sex:                  Female                               Male
ses:        A       B       C       D           A       B       C       D
color:
red         2 1%    0  0%   8 4%    22 11%      16 8%   2   1%  8   4%  3 1.5%
blue        9 4.5%  6  3%   4 2%    2  1%       12 6%   32 16%  14  7%  6   3%
green       4 2%    12 6%   2 1%    8  4%       0  0%   22 11%  40 20%  0   0%

我一直在尝试对 fromdatatablesexpssto的所有内容执行此操作gmodels,但我就是不知道如何获得这样的输出。CrossTablesfromgmodels最接近,但它仍然很远——(1)它把百分比放在计数之下,(2)我不能让它嵌套sel在下面sex,(3)我不知道如何让它分解生成的结果,以及 (4) 输出充满了破折号、垂直管道和空格,这使得将其放入文字处理器或电子表格成为容易出错的手动操作。

编辑:我删除了我的第二个问题(关于线图),因为第一个问题的答案是完美的并且值得称赞,即使它没有触及第二个问题。我会单独问第二个问题,就像我从一开始就应该问的那样。

4

2 回答 2

2

expss与包最接近的结果:

library(expss)
# generate example data
set.seed(123)
N = 300
df = data.frame(
    color = sample(c("red", "blue", "green"), size = N, replace = TRUE),
    agegroup = sample(1:5, size = N, replace = TRUE),
    sex = sample(c("Male", "Female"), size = N, replace = TRUE),
    ses = sample(c("A", "B", "C", "D"),  size = N, replace = TRUE),
    stringsAsFactors = FALSE
)

# redirect output to RStudio HTML viewer
expss_output_viewer()
res = df %>% 
    tab_cells("|" = color) %>% # dependent variable, "|" used to suppress label
    tab_cols(sex %nest% ses) %>% # column variable
    tab_rows(agegroup) %>% 
    tab_total_row_position("none") %>% # we don't need total
    tab_stat_cases(label = "Cases") %>% # calculate cases
    tab_stat_cpct(label = "%") %>% # calculate percent
    tab_pivot(stat_position = "inside_columns") %>% # finalize table
    make_subheadings(number_of_columns = 2)

# difficult part - add percent sign
for(i in grep("%", colnames(res))){
    res[[i]] = ifelse(trimws(res[[i]])!="", 
                      paste0(round(res[[i]], 1), "%"),
                      res[[i]] 
                      )
}

# additionlly remove stat labels
colnames(res) = gsub("\\|Cases|%", "", colnames(res), perl = TRUE)

res

在 RStudio 查看器中,结果将采用 HTML 格式(见图)。不幸的是,我无法测试它将如何粘贴到 MS Word。 在此处输入图像描述 免责声明:我是expss包的作者。

于 2018-09-15T14:17:50.990 回答
1

您可以adorn_ns(position = "front")从 janitor 包中使用。它会一起给你计数和百分比。

例如,这段代码:

df %>%  
arrange(desc(all)) %>%  
adorn_percentages("col") %>%
adorn_pct_formatting() %>% 
adorn_ns(position = "front") %>%
as.data.frame()

给出这个输出:

例子

于 2021-11-29T21:15:45.370 回答