Создание таблицы непредвиденных обстоятельств из сгруппированных значений

У меня есть фрейм данных "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().

Это возможно?


person Community    schedule 19.06.2017    source источник
comment
@bouncyball Великолепно! Почему бы не дать мне ответ, чтобы я мог согласиться?   -  person    schedule 19.06.2017
comment
почему не просто with(dat, table(letters == 'A', numbers <= 40))   -  person MichaelChirico    schedule 19.06.2017
comment
@MichaelChirico Когда-нибудь гениальнее! Хотя я должен сказать, что мне нравится возможность маркировать свой вывод с помощью метода bouncyball. Наличие двух измерений, обозначенных как ИСТИНА и ЛОЖЬ, меня немного смущает.   -  person    schedule 19.06.2017
comment
вы всегда можете добавить метки позже ;-)   -  person MichaelChirico    schedule 19.06.2017
comment
@ user8183921 опубликовал сообщение   -  person bouncyball    schedule 19.06.2017


Ответы (1)


Мы можем использовать всегда полезный _1 _ функция для переназначения точек данных. Мы также используем функцию 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))
person bouncyball    schedule 19.06.2017