【问题标题】:Creating a contingency table from grouped values从分组值创建列联表
【发布时间】:2017-11-21 22:26:54
【问题描述】:

我有一个数据框“dat”,其中包含一个因子“字母”(具有三个级别,“A”、“B”和“C”)和一个数字向量“数字”(带有值从 1 到 80):

dat <- data.frame(letters = sample(LETTERS[1:3], 15, replace = TRUE),
                  numbers = sample(80, 15, replace = TRUE))

我想创建一个列联表,其中将级别“B”和“C”分组,并将值分组为高于 40.5 的值和低于 40.5 的值。

也就是说,生成的列联表应该如下所示(当然频率不同):

> table(...)
       numbers
letters 1:40 41:80
      A    2     3
  B + C    4     6

我通过首先在我的数据框中引入两个新列然后从这些列创建表来创建该表:

dat$two.letters <- "A"
dat[dat$letters != "A", ]$two.letters <- "B + C"
dat$two.letters <- as.factor(dat$two.letters)
dat$two.numbers <- "1:40"
dat[dat$numbers > 40, ]$two.numbers <- "41:80"
dat$two.numbers <- as.factor(dat$two.numbers)
table(dat$two.letters, dat$two.numbers)

        1:40 41:80
  A        3     1
  B + C    6     5

但我想创建该表不引入新列或构建单独的数据框。相反,我想对 table() 命令中的值进行分组。

这可能吗?

【问题讨论】:

  • @bouncyball 太棒了!为什么不把它作为一个答案让我接受?
  • 为什么不只是with(dat, table(letters == 'A', numbers &lt;= 40))
  • @MichaelChirico 更加精彩!虽然我必须说我喜欢使用 bouncyball 方法标记输出的能力。有两个标注为“TRUE”和“FALSE”的维度让我有点困惑。
  • 您可以随时添加标签 ;-)
  • @user8183921 发布

标签: r contingency


【解决方案1】:

我们可以使用非常有用的ifelse 函数来重新标记您的数据点。我们还使用with 函数来避免额外的输入:

with(dat, 
    table(ifelse(letters == 'A', 'A', 'B+C'), ifelse(numbers <= 40, '1:40','41:80')))

      1:40 41:80
  A      1     2
  B+C    4     8

数据(注意set.seed的用法)

set.seed(123)
dat <- data.frame(letters = sample(LETTERS[1:3], 15, replace = TRUE),
                  numbers = sample(80, 15, replace = TRUE))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多