Рассчитайте уникальные комбинации значений в DataFrame и сводные значения

StackOverflow https://stackoverflow.com/questions/4697106

  •  11-10-2019
  •  | 
  •  

Вопрос

Я хотел бы работать с уникальными комбинациями 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, сумма каждого var1 ценности var2 ценности.

Вывод может выглядеть так:

      var1  n    svar
1     1     1    1
2     2     2    3
3     3     2    3
4     4     2    5
Это было полезно?

Решение

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

Обновление 2014: Использовать dplyr вместо plyr

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

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

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

Примечание вы можете заменить уникальным на любое количество функций, таких как поиск среднего и SD VAR2, как SO:

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))

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

Другие советы

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

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 

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

 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top