在 R 中同时设置 运行 多个交叉表的循环

Set up loop to run several crosstabs simultaneously in R

我正在尝试查找几列的加权交叉表。我的实际数据有 500 多列,所以我正在尝试尽可能地自动化该过程。

这是我的数据片段:

data_in <- read_table2("Q50_1   Q50_2   Q38 Q90 pov gender  wgt
1   3   Yes 2   High    M   1.3
2   4   No  2   Med F   0.4
4   2   Yes 4   Low F   1.2
3   3   No  2   High    M   0.5
1   2   No  4   High    M   0.7
2   2   Yes 3   Low F   0.56
4   4   Yes 2   Med F   0.9
")

我试过的:

我可以像这样使用 library(pollster) 包一次找到一个加权频率。我在这里使用 pivot 的时间更长,因为我需要它们中的每一个看起来相似,以便我将它们绑定到一个数据集中。

crosstab(df = data_in, pov, Q50_1, wgt,format = "long") %>% pivot_longer(cols = starts_with("Q"))
crosstab(df = data_in, pov, Q38, wgt, format = "long") %>% pivot_longer(cols = starts_with("Q"))

crosstab(df = data_in, gender, Q50_1, wgt,format = "long")%>% pivot_longer(cols = starts_with("Q"))
crosstab(df = data_in, gender, Q50_2, wgt,format = "long")%>% pivot_longer(cols = starts_with("Q"))

这是我想要的输出:

data_out <- read_table2("group  pct n   question    response    group_level
High    80  2.5 Q50_1   1   pov
High    20  2.5 Q50_1   3   pov
Low 31.8    1.76    Q50_1   2   pov
Low 68.2    1.76    Q50_1   4   pov
Med 30.8    1.3 Q50_1   2   pov
Med 69.2    1.3 Q50_1   4   pov
High    48  2.5 Q38 No  pov
High    52  2.5 Q38 Yes pov
Low 100 1.76    Q38 Yes pov
Med 30.8    1.3 Q38 No  pov
Med 69.2    1.3 Q38 Yes pov
F   31.4    3.06    Q50_1   2   gender
F   68.6    3.06    Q50_1   4   gender
M   80  2.5 Q50_1   1   gender
M   20  2.5 Q50_1   3   gender
")


更多我尝试过的:

我有创建某种函数的想法,它循环遍历两个向量。第一个向量包含将进入交叉表的每个 X 值,第二个向量包含将输入交叉表的每个 Y 值。这是我到目前为止所拥有的。我已经对此进行了一段时间的调整,但无济于事。

  vect <- c("gender", "pov")
vect2 <- c("Q50_1","Q38")

func2 <- function(.data, vector, vector2) {
  .data <- data_in
  wgt <- .data$wgt
  
  for (i in 1:length(vector)) 
    for (j in 1:length(vector2)) {
    out <- crosstab(df = .data, vector[i], vector2[j], wgt,format = "long")
  }
  out
}


func2(vect, vect2)

帮助:

  1. 这是实现我想要的输出的好方法吗?如果是这样,为什么我会不断收到错误消息? :(
  2. 我想为此添加功能,以便我使用所有交叉表创建单个数据集(如所需输出所示)。

任何建议表示赞赏!谢谢你的帮助!!

这是一种可行的方法。我确信有更好的方法,但在我目前的薪资等级中没有:

library(tidyverse)
library(pollster)

# Create a function that runs your crosstabs and pivots data:

xtab_func <- function(data, col, target){
  col <- sym(col)
  target <- enquo(target)
  crosstab(df = data, !!target, !!col, wgt, format = "long") %>% pivot_longer(cols = starts_with("Q"))
}

# Select 'Q' columns for your loops
cols <- data_in %>% select(starts_with("Q")) %>% names(.)

遍历 data.frame 性别变量

d <- list()
for (i in cols){
  x <- xtab_func(data_in, i, gender)
  x$i <- i
  x$group_level <- "gender"
  d[[i]] <- x
}

创建 data.frame 性别数据

df <- do.call(rbind, d) %>% 
  rename(group = gender)

对 pov 数据执行与上述相同的操作

d <- list()
for (i in cols){
  x <- xtab_func(data_in, i, pov)
  x$i <- i
  x$group_level <- "pov"
  d[[i]] <- x
}

df2 <- do.call(rbind, d) %>% 
  rename(group = pov)

清理列名并删除“i”列

final <- rbind(df, df2) %>% 
  select(-i, question = name, response = value)

最终看起来像这样:

# A tibble: 37 x 6
   group   pct     n question value group_level
   <fct> <dbl> <dbl> <chr>    <fct> <chr>      
 1 F      31.4  3.06 Q50_1    2     gender     
 2 F      68.6  3.06 Q50_1    4     gender     
 3 M      80    2.5  Q50_1    1     gender     
 4 M      20    2.5  Q50_1    3     gender     
 5 F      57.5  3.06 Q50_2    2     gender     
 6 F      42.5  3.06 Q50_2    4     gender     
 7 M      28.0  2.5  Q50_2    2     gender     
 8 M      72    2.5  Q50_2    3     gender     
 9 F      13.1  3.06 Q38      No    gender     
10 F      86.9  3.06 Q38      Yes   gender