不同科目 R 的不同条件下的循环排名和顺序

Rank and order in loop for different conditions for different subjects R

我有一个数据框 df:

Subject     RT      Trial       Block
1           234     1           1
1           563     2           1
1           234     3           1
1           234     1           2
1           467     2           2
1           234     3           2
1           543     1           3
1           466     2           3
1           111     3           3
2           343     1           1
2           44      2           1
2           223     3           1
2           324     1           2
2           34      2           2
2           242     3           2
2           54      1           3
2           656     2           3
2           345     3           3

我想为每个块的每个主题分配 RT 等级,因此 df 将如下所示:

Subject     RT      Trial       Block    Rank
1           234     1           1        1
1           563     2           1        3
1           239     3           1        2
1           230     1           2        1
1           467     2           2        3
1           234     3           2        2
1           543     1           3        3
1           466     2           3        2
1           111     3           3        1
2           343     1           1        3
2           44      2           1        1
2           223     3           1        2
2           324     1           2        3
2           34      2           2        1
2           242     3           2        2
2           54      1           3        1
2           656     2           3        3
2           345     3           3        2

然后我还想根据 Rank 列的内容对数据框进行排序。

我有一个参与者的代码,如下所示:

df$Rank <- ave( df$RTs, FUN=rank ) # introduce ranks for Rts
df<- df[order(df$Rank),] # sorting a data frame by the contents of the Rank column

我尝试循环这段代码,但我认为我进入了一个无限循环:

for (sno in df$Subject){
  for (bno in df$Block){
   ss <- subset(df, Subject == sno & Block == bno)
   df$Rank <- ave( df$RT, FUN=rank )
   df<- df[order(df$Rank),]
}

我的循环有什么问题?或者也许有更好的方法来实现它?

对于 dplyr,我们按 'Subject'、'Block' 分组,使用其中一个排名函数 (dense_rank/min_rank) 创建一个 'Rank' 列,和 arrange 按升序排列。

library(dplyr)
df %>% 
  group_by(Subject, Block) %>% 
  mutate(Rank = dense_rank(RT)) %>%
  arrange(Subject, Block, Rank)
#    Subject    RT Trial Block  Rank
#     (int) (int) (int) (int) (int)
#1        1   234     1     1     1
#2        1   239     3     1     2
#3        1   563     2     1     3
#4        1   230     1     2     1
#5        1   234     3     2     2
#6        1   467     2     2     3
#7        1   111     3     3     1
#8        1   466     2     3     2
#9        1   543     1     3     3
#10       2    44     2     1     1
#11       2   223     3     1     2
#12       2   343     1     1     3
#13       2    34     2     2     1
#14       2   242     3     2     2
#15       2   324     1     2     3
#16       2    54     1     3     1
#17       2   345     3     3     2
#18       2   656     2     3     3

在 OP 的代码中,有几处可以更改。

  1. 有了 ave,就不需要嵌套 for 循环
  2. 嵌套循环的输出被指定为创建 'Rank' 列,以便覆盖先前的输出。

如果我们使用 ave

df$Rank <- with(df, ave(RT, Subject, Block, FUN=rank)) 
df[do.call(order, df[c('Subject', 'Block', 'Rank')]),]