通过循环从一个变量的级别创建表

问题描述 投票:0回答:1

我目前正在 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%
r loops datatables
1个回答
0
投票

请确保预期输出也是可重现的数据。您可以使用

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)

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.