【问题标题】:Rank and order in loop for different conditions for different subjects R针对不同主题R的不同条件循环排序和排序
【发布时间】:2016-05-24 12:48:20
【问题描述】:

我有一个数据框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),]
}

我的循环有什么问题?或者也许有更好的方法来做这件事?

【问题讨论】:

    标签: r loops sorting rank


    【解决方案1】:

    对于dplyr,我们按“主题”、“块”分组,使用排名函数之一 (dense_rank/min_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. 嵌套循环的输出被分配以创建“排名”列,以便覆盖先前的输出。

    如果我们使用ave

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

    【讨论】:

    • 谢谢! ave 的第二个选项正是我正在寻找的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2012-04-12
    • 2019-07-07
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多