R

时间:2016-01-13 21:01:26

标签: r

我有一个关于在ave函数中使用which.max()获取索引值的问题。我从以下data.frame开始:

df <- data.frame(t_subjNum = c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2),
                 t_trialNum= c(1,1,1,2,2,2,2,1,1,1,1,2,2,2,2),
                 perpdist =  c(50,51,49,2,3,4,2,1,2,2,1,4,5,2,2),
                 angdiff =   c(60,61,60,-80,-81,-82,-81,40,41,42,41,61,60,61,62))

我想通过angdiff互动提取perpdist每个t_subjNum的最大绝对t_trialNum。所以,我做了一个像这样的公式:

df$maxangleINCORRECT   <- ave(df$perpdist, 
                       interaction(df$t_subjNum, df$t_trialNum), 
                       FUN = function(x) df$angdiff[which.max(abs(x))])

导致错误的angdiff值。它为t_subjNumt_trialNum交互中的观察子集创建索引(例如,subjNum = 1和trialNum = 2时为3而不是6)。有关如何修复索引的任何想法吗?

只是为了说明不正确的结果和所需的正确结果。

   t_subjNum t_trialNum perpdist angdiff maxangleINCORRECT maxangleCORRECT
1          1          1       50      60                61              61
2          1          1       51      61                61              61
3          1          1       49      60                61              61
4          1          2        2     -80                60             -82
5          1          2        3     -81                60             -82
6          1          2        4     -82                60             -82
7          1          2        2     -81                60             -82
8          2          1        1      40                61              41
9          2          1        2      41                61              41
10         2          1        2      42                61              41
11         2          1        1      41                61              41
12         2          2        4      61                61              60
13         2          2        5      60                61              60
14         2          2        2      61                61              60
15         2          2        2      62                61              60

1 个答案:

答案 0 :(得分:5)

我尝试修改ave,但发现它很复杂,因为它需要一个数字作为参数,因此您已经发现which.max给您带来麻烦。您可以考虑使用data.table。我知道这个输出与maxAngleCORRECT不匹配,但我认为这与关系有关(t_subjNum == 2和t_trialNum == 2,最大abs(perpdist)是5,引导到愤怒的60岁。

library(data.table)
setDT(df)[,maxangle:=angdiff[which.max(abs(perpdist))],by=.(t_subjNum,t_trialNum)]