Рассчитать уникальные комбинации значений в фрейме данных и итоговые значения - PullRequest
2 голосов
/ 15 января 2011

Я бы хотел работать с уникальными комбинациями var1 и var2 в моем фрейме данных:

foo <- data.frame(var1 = c(1,1,2,2,2,2,3,3,3,3,3,4,4,4,4),
                  var2 = c(1,1,1,1,2,2,1,1,2,2,2,2,2,3,3))

Как было отмечено, unique(foo) приводит к этому:

      var1  var2
 1    1     1
 2    2     1
 3    2     2
 4    3     1
 5    3     2
 6    4     2
 7    4     3

На основании уникальных комбинаций, как я могу получить:

  • n, число вхождений значения var1 и
  • svar, сумма значений var2 каждого значения var1.

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

      var1  n    svar
1     1     1    1
2     2     2    3
3     3     2    3
4     4     2    5

Ответы [ 3 ]

4 голосов
/ 15 января 2011

unique(foo) должен дать вам то, что вы ищете здесь.

ОБНОВЛЕНИЕ 2014: используйте dplyr вместо plyr

Я рекомендую заглянуть в библиотеку plyr для другихзадачи агрегирующего типа или базовые R эквиваленты tapply(), aggregate() и др.

Излишне для этого упражнения, вот как вы бы использовали plyr:

library(plyr)
ddply(foo, .(var1), unique)

Обратите внимание:можно заменить уникальное на любое количество функций, например, найти среднее значение и sd для var2 следующим образом:

ddply(foo, .(var1), summarise, mean = mean(var2), sd = sd(var2))

Ответ на редактирование

Теперь у вас есть болеезаконное использование для plyr().Взяв то, что мы узнали из вышеизложенного:

x <- unique(foo)

в сочетании с plyr:

ddply(x, .(var1), summarise, n = length(var2), sum = sum(var2))

Должно дать вам то, что вы ищете.

2 голосов
/ 15 января 2011

Надеюсь, я хорошо понимаю ваш вопрос, попробуйте:

unique(foo)

После того, как вопрос отредактирован:

Не писать так же, как @Chaseочень простое, но не слишком элегантное решение может быть:

foo$var12 <- paste(foo$var1, foo$var2, sep='|')      # the two variables combined to one
table(foo$var12)                                     # and showing its frequencies

И, конечно же, выводится таблица:

 1|1 2|1 2|2 3|1 3|2 4|2 4|3 
   2   2   2   2   3   2   2 
1 голос
/ 15 января 2011

Ответы отличаются от того, что вы заявляете, но я доверяю своему коду больше, чем доверяю вашему ответу, и я не могу заставить себя совершить грех, назвав переменную «сумма»:

 newfoo <- data.frame(
                 var1=unique(foo$var1),
                 n = with(foo, tapply(var2, var1, length) ),
                 svar = with(foo, tapply(var2, var1, sum) ) )
 newfoo
#  var1 n svar
#1    1 2    2
#2    2 4    6
#3    3 5    8
#4    4 4   10

РЕДАКТИРОВАТЬ: (сначала не понял, что Чейз сделал попытаться сказать мне.)

newfoo <- data.frame(
                  var1=unique(unique(foo)$var1),
                  n = with(unique(foo), tapply(var2, var1, length) ),
                  svar = with(unique(foo), tapply(var2, var1, sum) ) )

> newfoo
  var1 n svar
1    1 1    1
2    2 2    3
3    3 2    3
4    4 2    5
...