найти, какие переменные изменились на значение другой переменной - PullRequest
0 голосов
/ 28 сентября 2011

Учитывая следующее data.frame:

t   x   y
---------
1   1   3
1   1   3
1   1   2
2   1   2
2   2   2

Я бы хотел получить вывод вида

t   cnt cux cuy
---------------
1   3   1   2
2   2   2   1

, где cnt - это количество всех строк с определенным значением t, cux/ cuy - это число всех уникальных строк x / y

Другое ограничение заключается в том, что ответ должен работать для переменного числа столбцов.

Спасибо.

1 Ответ

2 голосов
/ 28 сентября 2011

То, что вы описываете словами и то, что вы показываете в ожидаемом результате, не согласны.В частности, подсчет уникальных значений y будет 2 и 1, а не 3 и 2 на основе вашего ввода.Следуя письменному описанию:

DF <- data.frame(t=c(1,1,1,2,2), x=c(1,1,1,1,2), y=c(3,3,2,2,2))

library("plyr")

ddply(DF, .(t), function(DF) {
    data.frame(cnt=length(DF$t), colwise(function(x) {length(unique(x))})(DF))
})

Или, если вы хотите что-то действительно функциональное, выглядящее:

library("functional")

ddply(DF, .(t), function(DF) {
    data.frame(cnt=length(DF$t), colwise(Compose(unique, length))(DF))
})

Или полностью за борт с функциональной парадигмой:

merge(ddply(DF, .(t), summarise, cnt=length(t)),
    ddply(DF, .(t), colwise(Compose(unique, length))))

Ни один из них не дает названия столбцов, которые вы просили;вместо cux это x.Однако впоследствии они могут быть изменены.

res <-
merge(ddply(DF, .(t), summarise, cnt=length(t)),
    ddply(DF, .(t), colwise(Compose(unique, length))))

names(res)[-(1:2)] <- paste("cu", names(DF)[-1], sep="")

, что дает

> res
  t cnt cux cuy
1 1   3   1   2
2 2   2   2   1
...