我有一个关于在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_subjNum
和t_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
答案 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)]