不同科目 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 的代码中,有几处可以更改。
- 有了
ave
,就不需要嵌套 for
循环
- 嵌套循环的输出被指定为创建 'Rank' 列,以便覆盖先前的输出。
如果我们使用 ave
df$Rank <- with(df, ave(RT, Subject, Block, FUN=rank))
df[do.call(order, df[c('Subject', 'Block', 'Rank')]),]
我有一个数据框 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 的代码中,有几处可以更改。
- 有了
ave
,就不需要嵌套for
循环 - 嵌套循环的输出被指定为创建 'Rank' 列,以便覆盖先前的输出。
如果我们使用 ave
df$Rank <- with(df, ave(RT, Subject, Block, FUN=rank))
df[do.call(order, df[c('Subject', 'Block', 'Rank')]),]