从分组值创建列联表

时间:2017-06-19 15:56:35

标签: r contingency

我有一个数据框,“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以下的值。

也就是说,生成的列联表应该是这样的(当然,频率不同):

> 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()命令中对值进行分组。

这可能吗?

1 个答案:

答案 0 :(得分:2)

我们可以使用有用的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))