将矢量值映射到数据框:计算百分位数
Mapping values from vector to the data frame: Calculating percentile
我有一个数字向量(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
我想计算并添加为新列 (nth) 每个主题的每个块的第 n 个百分位数,即第一个块第一个主题的 RTs 的第 61 个百分位数,第 2 个区块第 1 个主题的 RTs 的第 47 个百分位数,第 3 个区块第 1 个主题的 RTs 的第 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])
有没有更好的方法来计算百分位数并将它们添加为新列?我想可以使用循环或函数从向量中连续读取每个值,然后计算百分位数。
我认为向量nth_RT
与df
中的Block
和Subject
没有明确的对应关系。所以我建议你应该创建一个矩阵或 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
的更多信息
我有一个数字向量(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
我想计算并添加为新列 (nth) 每个主题的每个块的第 n 个百分位数,即第一个块第一个主题的 RTs 的第 61 个百分位数,第 2 个区块第 1 个主题的 RTs 的第 47 个百分位数,第 3 个区块第 1 个主题的 RTs 的第 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])
有没有更好的方法来计算百分位数并将它们添加为新列?我想可以使用循环或函数从向量中连续读取每个值,然后计算百分位数。
我认为向量nth_RT
与df
中的Block
和Subject
没有明确的对应关系。所以我建议你应该创建一个矩阵或 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
的更多信息