【问题标题】:Mapping values from vector to the data frame: Calculating percentile将值从向量映射到数据框:计算百分位数
【发布时间】:2016-05-26 02:52:42
【问题描述】:

我有一个数字向量 (nth_RT) 和一个数据框 (df):

nth_RT 
[1] 0.61 0.47 0.50 0.53 0.50 0.56


df
#    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

我想计算每个主题的每个区块的第 n 个百分位数并将其添加为新列 (nth),即第一个区块第一个主题的 RT 的第 61 个百分位数,第 47 个百分位数的第 2 块第 1 主题的 RT,第 3 块第 1 主题的第 50 个百分位数,第 1 个第 2 参与者的第 53 个百分位数等。所以数据框看起来像这样:

df
#    Subject    RT Trial Block  Rank  nth
#1        1   234     1     1     1   310.28
#2        1   239     3     1     2   310.28
#3        1   563     2     1     3   310.28
#4        1   230     1     2     1   233.76
#5        1   234     3     2     2   233.76
#6        1   467     2     2     3   233.76
#7        1   111     3     3     1   466
#8        1   466     2     3     2   466
#9        1   543     1     3     3   466
#10       2    44     2     1     1   230.2
#11       2   223     3     1     2   230.2
#12       2   343     1     1     3   230.2
#13       2    34     2     2     1   242
#14       2   242     3     2     2   242
#15       2   324     1     2     3   242
#16       2    54     1     3     1   382.32
#17       2   345     3     3     2   382.32
#18       2   656     2     3     3   382.32

我有一个每个参与者一个区块的代码,但它不起作用:

nth_RT <-quantile(df$RT ~ Block * Subject, nth_RT[1])

有没有更好的方法来计算百分位数并将它们添加为新列?我想可以使用循环或函数从向量中连续读取每个值,然后计算百分位数。

【问题讨论】:

    标签: r function loops vector percentile


    【解决方案1】:

    我认为向量nth_RTdf 中的BlockSubject 没有明确的对应关系。所以我建议你应该创建一个矩阵或 data.frame 来清楚地显示对应关系。例如,

    grid <- expand.grid(Block = unique(df$Block), Subject = unique(df$Subject))
    grid_nth_RT <- cbind(grid, nth_RT)
    

    然后你会得到:

    > grid_nth_RT
      Block Subject nth_RT
    1     1       1   0.61
    2     2       1   0.47
    3     3       1   0.50
    4     1       2   0.53
    5     2       2   0.50
    6     3       2   0.56
    

    然后,我们可以使用 for 循环遍历每个 Block-Subject 对。

    df$nth <- array(0, nrow(df))
    for(i in 1:nrow(grid_nth_RT)) {
      index <- df$Block == grid_nth_RT[i,"Block"] &
               df$Subject == grid_nth_RT[i,"Subject"]
      df$nth[index] <- quantile(df[index,"RT"], grid_nth_RT[i,"nth_RT"])
    }
    

    我们在第 i 个Block-Subject 的所有行中找到index。然后我们可以子集df[index,"RT"]。我们以grid_nth_RT[i,"nth_RT"] 的百分比计算df[index,"RT"] 的分位数。我们将结果存储到df$nth[index]

    > df
       Subject  RT Trial Block Rank    nth
    1        1 234     1     1    1 310.28
    2        1 239     3     1    2 310.28
    3        1 563     2     1    3 310.28
    4        1 230     1     2    1 233.76
    5        1 234     3     2    2 233.76
    6        1 467     2     2    3 233.76
    7        1 111     3     3    1 466.00
    8        1 466     2     3    2 466.00
    9        1 543     1     3    3 466.00
    10       2  44     2     1    1 230.20
    11       2 223     3     1    2 230.20
    12       2 343     1     1    3 230.20
    13       2  34     2     2    1 242.00
    14       2 242     3     2    2 242.00
    15       2 324     1     2    3 242.00
    16       2  54     1     3    1 382.32
    17       2 345     3     3    2 382.32
    18       2 656     2     3    3 382.32
    

    顺便说一下,从你的代码

    quantile(df$RT ~ Block * Subject, nth_RT[1])
    

    我认为你对~ 有一些误解。 ~ 的东西在 R 中被称为 formula。你可以查看这个页面 https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html 详细了解 R 中的formula

    【讨论】:

    • 非常感谢您的回答!它工作得很好。确实,我想我一定要检查一些有关公式的信息。
    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 2019-05-28
    • 2021-02-26
    • 1970-01-01
    • 2017-04-26
    • 2019-02-16
    • 2011-12-29
    • 2013-06-20
    相关资源
    最近更新 更多