Использование R для применения уравнения к определенным группам данных в наборе данных - PullRequest
2 голосов
/ 25 февраля 2012

У меня есть набор данных, и я хотел бы применить уравнение к группам моих значений.В частности, я хотел бы применить

sqrt(X^2+Y^2+Z^2)

ко всем значениям в течение определенного времени и переменной

Глядя на данные ниже, я хотел бы сгруппировать свои значения по уникальному времени (TS) и ячейкам(Bin) и возьмите квадратный корень из суммы квадратов для каждого из компонентов XY и Z.

    id  D      Bin  value   Month Day Year Hour Minute Second                  TS
    1   X       V1   -0.320     1  30 2012   13     59     50 2012-01-30 13:59:50
    1   Y       V1   -0.088     1  30 2012   13     59     50 2012-01-30 13:59:50
    1   Z       V1    0.171     1  30 2012   13     59     50 2012-01-30 13:59:50
    1   X       V2    0.368     1  30 2012   13     59     50 2012-01-30 13:59:50
    1   Y       V2   -0.104     1  30 2012   13     59     50 2012-01-30 13:59:50
    1   Z       V2    0.008     1  30 2012   13     59     50 2012-01-30 13:59:50
    2   X       V1   -0.052     1  30 2012   14      0     50 2012-01-30 14:00:50
    2   Y       V1    0.278     1  30 2012   14      0     50 2012-01-30 14:00:50
    2   Z       V1   -0.086     1  30 2012   14      0     50 2012-01-30 14:00:50
    2   X       V2   -0.214     1  30 2012   14      0     50 2012-01-30 14:00:50
    2   Y       V2    0.118     1  30 2012   14      0     50 2012-01-30 14:00:50
    2   Z       V2   -0.030     1  30 2012   14      0                        

Таким образом, на первом месте будет V1 в 13: 59: 50

sqrt(-0.320^2 + -0.088^2 + 0.171^2)

и затем для V2 в момент времени t13: 59: 50

sqrt(0.368^2 +-0.104^2  + 0,008^2)

и т. Д.

Я пытался использовать эту формулу (данные называются "V")

 V=aggregate(value~TS+variable,data=V,sqrt((if(V$D=="X")V$value^2)+(if(V$D=="Y")V$value^2))+(if(V$D=="Z")V$value^2))

Но очевидно, что это не работает.Так есть ли у кого-нибудь лучший способ сначала индексировать уникальные группы в наборе данных, а не применять уравнение к указанной группе?

Ответы [ 3 ]

3 голосов
/ 25 февраля 2012

Используйте пакеты plyr и reshape (или reshape2). (Действительно. Если вы не используете эти пакеты, вы будете изумлены, насколько лучше дела обстоят.) Вкратце, вам нужно сначала cast() свои данные в широкой форме, чтобы вместо столбцов с именем D и value, у вас есть столбцы с именами X, Y и Z. Оттуда вы можете использовать любое количество методов. transform в базе будет работать, хотя мне нравится mutate в пакете plyr немного лучше:

V <- mutate(V, norm=sqrt(X^2+Y^2+Z^2))
2 голосов
/ 25 февраля 2012

Предполагая, что у вас всегда есть один X, один Y и один Z для каждой комбинации (TS, Bin), я бы попробовал это:

aggregate(value ~ TS + Bin, data = V, FUN = function(x)sqrt(sum(x^2)))
1 голос
/ 25 февраля 2012
library("plyr")
ddply(V, .(TS, Bin), summarise, norm=sqrt(sum(value*value)))

Если в комбинации TS / Bin имеется только один X, Y и Z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...