0

我有一个包含三个变量的数据框:

  1. ID
  2. 性别(男、女、女)
  3. 药物 (1,2,3,4,5,6,7,8,9,10)

对于“药物”,问卷中可以进行多项选择,因此现在数据框的每个单元格中有多个数字(用“;”分隔)。是否可以创建一个频率表来单独计算每个数字(1-10)并按性别分组?我需要在行中有“药物”(1-10),并将按性别分组的计数作为列。

我已经尝试拆分列,以便每个单元格只剩下一个值。但是我仍然有计算多列中的值的问题。对于到目前为止我尝试过的每个函数,变量都是单独计算的。

谢谢您的帮助!

对不起,我不知道如何用 dput 来做。这是截图,希望对你有帮助!(Geschlecht = 性别;Medikament = 药物

这是预期的输出,但没有像“01;03”这样的组合

4

1 回答 1

1

如果没有特定的、可重现的示例,这样的文本解析可能会很困难。但是,听起来您的数据框看起来像这样:

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 包于 2022-02-06 创建(v2.0.1)

于 2022-02-06T17:45:51.063 回答