Подтвердить что ты не робот

Преобразование кадра данных в специально отформатированную частотную таблицу

У меня есть data.frame, и я пытаюсь создать частотную таблицу, которая показывает частоту значений для каждой строки. Поэтому я начинаю с чего-то вроде этого:

d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5))

который выглядит следующим образом:

  a b c
  1 3 1
  2 4 2
  3 5 5

То, что я действительно хотел бы создать, - это data.frame или матрица непредвиденных ситуаций, которая выглядит так:

1, 2, 3, 4, 5, 6, 7, 8, 9
2, 0, 1, 0, 0, 0, 0, 0, 0
0, 2, 0, 1, 0, 0, 0, 0, 0
0, 0, 1, 0, 2, 0, 0, 0, 0

Верхняя строка - это просто строка ярлыка и не обязательно должна быть в конечном результате. Но я добавляю его для иллюстрации. Каждая строка показывает цифры 1: 9 и количество раз, которое каждая цифра отображается в каждой строке исходных данных.

Я не могу обернуть голову вокруг легкого способа создать это. Хотя кажется, что функция table() должна быть полезна, я не могу заставить ее любить. Любая помощь или идеи приветствуются.

4b9b3361

Ответ 1

Здесь вы идете:

t(apply(d, 1, tabulate, nbin=9))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    2    0    1    0    0    0    0    0    0
[2,]    0    2    0    1    0    0    0    0    0
[3,]    0    0    1    0    2    0    0    0    0

(Хотя, вероятно, это не имеет значения в этом приложении, tabulate() (который используется внутри кода для table()) также хорош для впечатляющей скорости, с которой он выполняет свои вычисления.)


EDIT: tabulate() не настроен для работы с 0 или отрицательными целыми числами. Если вам нужен еще один лайнер, вы можете использовать table(), хотя бы что-то вроде этого:

d <- data.frame(a=c(0,-1,-2), b=c(3,4,5), c=c(1,2,5))

t(apply(d, 1, function(X) table(c(X, -9:9)) - 1))
     -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
[1,]  0  0  0  0  0  0  0  0  0 1 1 0 1 0 0 0 0 0 0
[2,]  0  0  0  0  0  0  0  0  1 0 0 1 0 1 0 0 0 0 0
[3,]  0  0  0  0  0  0  0  1  0 0 0 0 0 0 2 0 0 0 0

Ответ 2

другое решение с использованием таблицы

library(reshape)
d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5))
d2 <- melt(d)
d2$rows <- rep(1:nrow(d), ncol(d))
table(d2$rows, d2$value)