如何从 R 中的多重响应模态创建频率变量?

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

我正在 R 中开发一个数据库,这是一份调查问卷的结果。我对某些变量有疑问。有些问题很好,并且被分配给一个变量,例如问题 17 有 4 个可能的答案,当我这样做时

table(d$v17)
我得到

 1   2   3   4 
328 100  12  22 

但是,有些问题不是分配给单个变量,而是为每个答案创建一个变量,并且没有变量立即将所有答案重新分组。我在第 18 题中遇到了这种情况,该问题允许多项选择答案,有 11 种模式。我没有使用一个变量

v18
来得到与上面类似的结果,而是有 11 个从
v18_r1
v18_r11
的变量,因此我不能像我在问题中那样做
table
17.

这让我困扰的原因是我希望将问题 18 的所有值都放在同一个变量中,以便稍后可以在

tbl_summary
中使用它,以便与另一个变量交叉。

我最接近解决这个问题的是这段代码(来自 ChatGPT):

# Initialize a variable for the counts
count_result <- rep(0, 11)

# Loop through each row of the data frame
for (i in 1:nrow(d)) {
  # Check each column from v18_r1 to v18_r11 to see if the value is non-NA
  for (j in 1:11) {
    if (!is.na(d[i, paste0("v18_r", j)])) {
      count_result[j] <- count_result[j] + 1  # Increment the count for this option
    }
  }
}

# Display the result
count_result

但是它只打印每个答案的频率,没有上面的 1、2、3 等,我不能在

tbl_summary
中使用它。

如果它可能有用,这是我使用时变量的样子

str(d)
:

$ v18_r1            : int  1 NA NA NA NA NA NA NA NA NA ...
 $ v18_r2            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ v18_r3            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ v18_r4            : int  4 NA 4 NA NA NA NA NA NA NA ...
 $ v18_r5            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ v18_r6            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ v18_r7            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ v18_r8            : int  8 NA NA NA 8 NA NA NA NA NA ...
 $ v18_r9            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ v18_r10           : int  10 NA 10 NA 10 NA NA NA 10 NA ...
 $ v18_r11           : int  NA NA NA NA NA NA NA NA NA NA ...

提前非常感谢大家。

r dataframe
1个回答
0
投票

您可以将所有相关信息保留在一栏中,但它读起来很难看......

library(tidyverse)
library(glue)
(example_start <- data.frame(
  V17 = 1:3,
  V18_r1 = c(1, NA, NA),
  V18_r2 = c(4, NA, NA),
  V18_r3 = c(NA, NA, 3)
))

name_and_val <- function(val) {
  glue("{dplyr::cur_column()}={val}")
}

(example_end <- mutate(rowwise(example_start),
  across(starts_with("v18_r"), name_and_val),
  V18 = paste0(pick(starts_with("V18_r")), collapse = ";")
) |>
  select(-starts_with("v18_r")))

结果

table(example_end$V17)

1 2 3 
1 1 1 
> table(example_end$V18)

  V18_r1=1;V18_r2=4;V18_r3=NA  V18_r1=NA;V18_r2=NA;V18_r3=3 V18_r1=NA;V18_r2=NA;V18_r3=NA 
                            1                             1                             1 

这有帮助吗?

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