我有这样的数据:
pat# sex race group bmi
1 F Black 1 4
2 M Asian 2 8
3 M Asian 3 19
4 M Asian 1 35
5 F Black 2 12
6 F Black 3 33
7 M White 1 2
8 F Black 2 35
9 M Asian 3 6
10 F Black 1 13
11 F Black 2 18
12 F Asian 3 1
13 M White 1 36
14 F Asian 2 25
15 M White 3 6
16 M White 1 20
17 F Black 2 3
18 M Asian 3 23
19 F Black 1 26
20 F Asian 2 13
21 M White 3 21
22 M White 1 16
23 F Black 2 29
24 F Black 3 19
25 M Asian 1 17
26 M Asian 2 22
27 F Black 3 26
我想得到每个变量的频率和每个变量组的百分比,像这样:
n 1 2 3
sex M frequency % % %
F frequency % % %
下一个变量:
n 1 2 3
race White frequency % % %
Asian frequency % % %
Black frequency % % %
有很多变量,所以我不想列出每一个。我试图使用R的矢量特征(df[2:30]
)使用xtabs()
和dplyr
包,但我没有让它工作。选择哪个包或函数并不重要,但我们希望使其足够灵活,以适应将来使用不同列名和具有不同维度的数据。任何建议都非常感谢!!
一种方法是使用janitor
包,但它也会将总数更改为百分比:
library(janitor)
df %>%
tabyl(sex, group) %>%
adorn_totals("col") %>%
adorn_percentages() %>%
adorn_pct_formatting(digits = 2)
sex 1 2 3 Total
F 21.43% 50.00% 28.57% 100.00%
M 46.15% 15.38% 38.46% 100.00%
#But we could also choose counts
df %>%
tabyl(sex, group) %>%
adorn_totals("col")
sex 1 2 3 Total
F 3 7 4 14
M 6 2 5 13
我能够使用table()
函数和tigerstats
包来做到这一点。我遇到的主要问题是R将SAS数据集与CSV数据集区别对待。日日夜夜!
tidyverse
的方式是-
library(tidyverse)
df %>%
count(sex, group) %>%
group_by(sex) %>%
mutate(n = prop.table(n) * 100) %>%
pivot_wider(names_from = group, values_from = n, values_fill = 0)
# sex `1` `2` `3`
# <chr> <dbl> <dbl> <dbl>
#1 F 21.4 50 28.6
#2 M 46.2 15.4 38.5
如果你想为多个变量这样做,你可以使用map
-
cols <- c('sex', 'race')
map(cols, ~df %>%
count(.data[[.x]], group) %>%
group_by(.data[[.x]]) %>%
mutate(n = prop.table(n) * 100) %>%
pivot_wider(names_from = group, values_from = n, values_fill = 0) %>%
ungroup)
#[[1]]
# A tibble: 2 x 4
# sex `1` `2` `3`
# <chr> <dbl> <dbl> <dbl>
#1 F 21.4 50 28.6
#2 M 46.2 15.4 38.5
#[[2]]
# A tibble: 3 x 4
# race `1` `2` `3`
# <chr> <dbl> <dbl> <dbl>
#1 Asian 20 40 40
#2 Black 27.3 45.5 27.3
#3 White 66.7 0 33.3
如果你需要频率,你可以这样做:
lapply(df[2:3], table, df$group)
$race
1 2 3
Asian 2 4 4
Black 3 5 3
White 4 0 2
$group
1 2 3
1 9 0 0
2 0 9 0
3 0 0 9
如果你需要百分比,你必须定义你需要的百分比,即行,列,总计等
如果需要按行排列:
lapply(df[2:3], function(x)prop.table(table(x, df$group),1)*100)
$sex
x 1 2 3
F 21.42857 50.00000 28.57143
M 46.15385 15.38462 38.46154
$race
x 1 2 3
Asian 20.00000 40.00000 40.00000
Black 27.27273 45.45455 27.27273
White 66.66667 0.00000 33.33333