我正在 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 ...
提前非常感谢大家。
您可以将所有相关信息保留在一栏中,但它读起来很难看......
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
这有帮助吗?