преобразовать кадр данных в специально отформатированную таблицу частот - PullRequest
18 голосов
/ 16 марта 2012

У меня есть 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() должна быть полезной, я не могу заставить ее любить. Любая помощь или идеи приветствуются.

Ответы [ 2 ]

12 голосов
/ 16 марта 2012

Вот, пожалуйста:

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
9 голосов
/ 16 марта 2012

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...