r - 如何仅为一种结果类型计算新数据框?
问题描述
我正在处理一些数据,这些数据涉及参与者在认知任务上运行,该任务测量他们的结果(正确或不正确)和反应时间(RT)(整个数据集称为练习)。对于每个参与者,我想在他们得到正确答案时创建一个具有平均 RT 的新数据框,并在他们不正确时创建一个新数据框。我试过了
practice %>%
mutate(correctRT = mean(practice$RT[practice$Outcome=="Correct"]))
使用 dplyr 和 tidyverse,以及
correctRT <- c(mean(practice$RT[practice$Outcome=="Correct"]))
(我确信这不是正确的方法)并且似乎没有任何工作。我是一个完全的新手,正在使用这个数据集来学习如何使用 R 进行统计,但无法用 R 找到任何答案。
解决方案
在 R 中,您可以在单个列表中“保留”多个对象(例如数据帧)。这使您不必将每个(子)数据帧存储在单独的变量中(例如,通过子集您的问题并根据参与者、结果存储它)。当您有“许多”个人并且手动过滤器和(子)数据框的存储变得禁止时,这将派上用场。
从概念上讲,您的问题是将数据“子集”到您的目标参与者和结果,并计算该组的平均值。
以下是基于{tidyverse}
,即{dplyr}
。
数据
由于您没有提供可重现的示例,因此这是对您的数据的快速破解:
practice <- data.frame(
Participant = c("A","A","A","B","B","B","B","C","C","D"),
RT = c(10, 12, 14, 9, 12, 13, 17, 11, 13, 17),
Outcome = c("Incorrect","Correct", "Correct","Incorrect","Incorrect","Correct", "Correct","Incorrect","Correct", "Correct")
)
如下所示:
practice
Participant RT Outcome
1 A 10 Incorrect
2 A 12 Correct
3 A 14 Correct
4 B 9 Incorrect
5 B 12 Incorrect
6 B 13 Correct
7 B 17 Correct
8 C 11 Incorrect
9 C 13 Correct
10 D 17 Correct
拆分数据框的组
{tidyverse}
为一般数据处理提供了一些简洁的功能
。{dplyr}
有一个group_split()
返回这样一个列表的函数。
library(dplyr)
practice %>% group_split(Participant, Outcome)
<list_of<
tbl_df<
Participant: character
RT : double
Outcome : character
>
>[7]>
[[1]]
# A tibble: 2 x 3
Participant RT Outcome
<chr> <dbl> <chr>
1 A 12 Correct
2 A 14 Correct
[[2]]
...
[[]]
您可以使用符号处理相应的列表元素。将列表存储在变量中并尝试my_list_name[[3]]
提取第三个元素。
您的问题的潜在摘要
如果您不需要列表,则可以将其包装到数据摘要中。如果您想拆分结果,您可能希望在 2 个子数据帧中过滤您的数据,这些子数据帧仅包含相应的结果(例如correct <- practice %>% filter(Outcome == "Correct")
)。
根据您要构建的摘要对数据进行分组。用于summarise()
将您的组汇总为 1 行摘要。请注意,您可以组合多个操作。例如,在平均反应时间旁边,以下计算行数(:=尝试)。
practice %>%
group_by(Participant, Outcome) %>%
##--------- summarise data into 1 row summarise
summarise( Mean_RT = mean(RT) # calculate mean reaction time
,Attempts = n() ) # how many times
这产生:
# A tibble: 7 x 4
# Groups: Participant [4]
Participant Outcome Mean_RT Attempts
<chr> <chr> <dbl> <int>
1 A Correct 13 2
2 A Incorrect 10 1
3 B Correct 15 2
4 B Incorrect 10.5 2
5 C Correct 13 1
6 C Incorrect 11 1
7 D Correct 17 1
请注意,这是一个分组数据框。如果进一步处理数据,则需要“删除”分组。否则,管道中的任何后续操作都将在组级别上进行。
为此,您可以使用summarise(...., .groups = "drop")
或添加... %>% ungroup()
到管道中。
如果您需要拆分结果,请检查上面的group_split()
.