我目前正在 R 中制作表格,想知道是否有办法让我的过程变得不那么乏味。我正在制作带有两个变量的表格,但是我正在遍历第一个变量的级别,并根据第二个变量为每个级别创建一个表。代码示例如下:
prop.table(table(df[df$v1 == 6 , c("v1" , "v2")]))*100
变量 v1 有 6 个级别,我想创建一个从 1 开始到 6 的循环(所有变量都是数字,但并非所有变量都以 6 结束)并为 v1 到 v2 的每个级别生成表。
变量 v2 有两个级别,不确定这是否相关,但以防万一。
谢谢!
编辑:我已经包含了示例代码和所需的输出表,很抱歉之前没有包含这些!
id <- 1:20
age <- c(1, 2, 2, 3, 1, 1, 4, 5, 6, 6, 5, 4, 4, 4, 2, 1, 1, 2, 3, 1)
gender <- c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 3, 3, 2, 2, 2, 1, 2)
response <- c(1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1)
df <- data.frame(id, age, gender, response)
这是我希望从生成的循环中看到的表输出的示例。它使用
age
变量迭代 response
变量的每个级别(6 个级别)。我希望这个循环也适用于 gender
变量,它有 5 个级别。
年龄 | 回复(0) | 回应(1) |
---|---|---|
1 | 40% | 60% |
年龄 | 回复(0) | 回应(1) |
---|---|---|
2 | 50% | 50% |
年龄 | 回复(0) | 回应(1) |
---|---|---|
3 | 20% | 80% |
年龄 | 回复(0) | 回应(1) |
---|---|---|
4 | 70% | 30% |
年龄 | 回复(0) | 回应(1) |
---|---|---|
5 | 100% | 90% |
年龄 | 回复(0) | 回应(1) |
---|---|---|
6 | 30% | 70% |
请确保预期输出也是可重现的数据。您可以使用
dput(expected_output)
或 datapasta::tribble_format(expected_output)
来完成。
您的预期输出不一致(正如@Friede提到的),但它足够容易理解。
这个解决方案并不简洁,但更容易遵循和进行调整(imo)。
输入(这是
tidyverse
):
library(tidyverse)
# datapasta::tribble_format()
input <- tibble::tribble(
~id, ~age, ~gender, ~response,
1L, 1, 1, 1,
2L, 2, 1, 0,
3L, 2, 1, 1,
4L, 3, 1, 1,
5L, 1, 1, 0,
6L, 1, 1, 0,
7L, 4, 1, 0,
8L, 5, 2, 1,
9L, 6, 2, 1,
10L, 6, 2, 0,
11L, 5, 2, 0,
12L, 4, 1, 1,
13L, 4, 1, 1,
14L, 4, 3, 0,
15L, 2, 3, 0,
16L, 1, 2, 0,
17L, 1, 2, 0,
18L, 2, 2, 1,
19L, 3, 1, 1,
20L, 1, 2, 1)
选择您要处理的变量。您不需要将它们全部包括在内,并且并非所有这些都必须出现在
input
:
variables <- c("age", "gender")
该过程有一个中间步骤来填充值、组合等,是您进行调整的好地方:
aux <- input %>%
pivot_longer(any_of(variables), names_to = "variable", values_to = "value") %>%
count(variable, value, response) %>%
mutate(prop = 100 * prop.table(n), .by = c(variable, value)) %>%
complete(nesting(variable, value), response, fill = list(n = 0, prop = 0))
> aux
# A tibble: 18 × 5
variable value response n prop
<chr> <dbl> <dbl> <int> <dbl>
1 age 1 0 4 66.7
2 age 1 1 2 33.3
3 age 2 0 2 50
4 age 2 1 2 50
5 age 3 0 0 0
6 age 3 1 2 100
7 age 4 0 2 50
8 age 4 1 2 50
9 age 5 0 1 50
10 age 5 1 1 50
11 age 6 0 1 50
12 age 6 1 1 50
13 gender 1 0 4 40
14 gender 1 1 6 60
15 gender 2 0 4 50
16 gender 2 1 4 50
17 gender 3 0 2 100
18 gender 3 1 0 0
output
将按变量值合并总观测值与以宽格式计算的比例:
output <- left_join(
summarise(aux, .by = c(variable, value), n = sum(n)),
pivot_wider(aux, id_cols = -n, names_from = response, names_glue = "response_{response}", values_from = prop),
by = c("variable", "value"))
> output
# A tibble: 9 × 5
variable value n response_0 response_1
<chr> <dbl> <int> <dbl> <dbl>
1 age 1 6 66.7 33.3
2 age 2 4 50 50
3 age 3 2 0 100
4 age 4 4 50 50
5 age 5 2 50 50
6 age 6 2 50 50
7 gender 1 10 40 60
8 gender 2 8 50 50
9 gender 3 2 100 0
抛弃中介帮手:
rm(aux)
希望有帮助。