使用 "multiple selection" 变量的频率计数
Frequency counts with a "multiple selection" variable
我有一个包含三个变量的数据框:
- ID
- 性别(男女)
- 药物 (1,2,3,4,5,6,7,8,9,10)
对于“药物”,问卷中可以进行多项选择,因此现在数据框的每个单元格中都有多个数字(以“;”分隔)。
是否可以创建一个频率 table 来单独计算每个数字 (1-10) 并按性别分组?我需要在行中包含“药物”(1-10),并将按性别分组的计数作为列。
我已经尝试拆分列,以便每个单元格只留下一个值。但是我仍然有计算多列值的问题。对于我到目前为止尝试的每个函数,变量都已单独计算。
感谢您的帮助!
Sorry, I don't know how to do it with dput. Here is a screenshot, I hope that helps! (Geschlecht = gender; Medikament = medication
And this is the expected output but without the combinations like "01;03"
如果没有特定的、可重现的示例,像这样的文本解析可能会很困难。但是,听起来您的数据框看起来像这样:
df
#> ID medication gender
#> 1 1 9 f
#> 2 2 2;1;3 m
#> 3 3 6;2 d
#> 4 4 3 f
#> 5 5 7;8;7;1 f
#> 6 6 6;9;4;6 m
#> 7 7 9 d
#> 8 8 8;6;3 f
#> 9 9 9;7 d
#> 10 10 8;6 m
在这种情况下,以 R 为基数获得结果的简单方式如下所示:
meds <- lapply(split(df, df$gender),
function(x) unlist(strsplit(x$medication, ";\s?")))
genders <- rep(c("d", "f", "m"), times = lengths(meds))
table(gender = genders, medication = unlist(meds))
#> medication
#> gender 1 2 3 4 5 6 7 8 9 10
#> d 0 1 0 0 0 1 1 0 2 0
#> f 1 0 2 0 0 1 2 2 1 0
#> m 1 1 1 1 0 3 0 1 1 0
可重现数据
set.seed(2)
medication <- sapply(rpois(10, 2), function(x) {
if(x == 0) x <- 1
x <- sample(1:10, x, TRUE)
paste(x, collapse = ";")
})
gender <- sample(c("m", "f", "d"), 10, TRUE, prob = c(2, 2, 1))
df <- data.frame(ID = 1:10, medication = medication, gender = gender)
由 reprex package (v2.0.1)
于 2022-02-06 创建
我有一个包含三个变量的数据框:
- ID
- 性别(男女)
- 药物 (1,2,3,4,5,6,7,8,9,10)
对于“药物”,问卷中可以进行多项选择,因此现在数据框的每个单元格中都有多个数字(以“;”分隔)。 是否可以创建一个频率 table 来单独计算每个数字 (1-10) 并按性别分组?我需要在行中包含“药物”(1-10),并将按性别分组的计数作为列。
我已经尝试拆分列,以便每个单元格只留下一个值。但是我仍然有计算多列值的问题。对于我到目前为止尝试的每个函数,变量都已单独计算。
感谢您的帮助!
Sorry, I don't know how to do it with dput. Here is a screenshot, I hope that helps! (Geschlecht = gender; Medikament = medication
And this is the expected output but without the combinations like "01;03"
如果没有特定的、可重现的示例,像这样的文本解析可能会很困难。但是,听起来您的数据框看起来像这样:
df
#> ID medication gender
#> 1 1 9 f
#> 2 2 2;1;3 m
#> 3 3 6;2 d
#> 4 4 3 f
#> 5 5 7;8;7;1 f
#> 6 6 6;9;4;6 m
#> 7 7 9 d
#> 8 8 8;6;3 f
#> 9 9 9;7 d
#> 10 10 8;6 m
在这种情况下,以 R 为基数获得结果的简单方式如下所示:
meds <- lapply(split(df, df$gender),
function(x) unlist(strsplit(x$medication, ";\s?")))
genders <- rep(c("d", "f", "m"), times = lengths(meds))
table(gender = genders, medication = unlist(meds))
#> medication
#> gender 1 2 3 4 5 6 7 8 9 10
#> d 0 1 0 0 0 1 1 0 2 0
#> f 1 0 2 0 0 1 2 2 1 0
#> m 1 1 1 1 0 3 0 1 1 0
可重现数据
set.seed(2)
medication <- sapply(rpois(10, 2), function(x) {
if(x == 0) x <- 1
x <- sample(1:10, x, TRUE)
paste(x, collapse = ";")
})
gender <- sample(c("m", "f", "d"), 10, TRUE, prob = c(2, 2, 1))
df <- data.frame(ID = 1:10, medication = medication, gender = gender)
由 reprex package (v2.0.1)
于 2022-02-06 创建