Рассчитайте уникальные комбинации значений в DataFrame и сводные значения
-
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