首页 > 解决方案 > 如何仅为一种结果类型计算新数据框?

问题描述

我正在处理一些数据,这些数据涉及参与者在认知任务上运行,该任务测量他们的结果(正确或不正确)和反应时间(RT)(整个数据集称为练习)。对于每个参与者,我想在他们得到正确答案时创建一个具有平均 RT 的新数据框,并在他们不正确时创建一个新数据框。我试过了

    practice %>%
  mutate(correctRT = mean(practice$RT[practice$Outcome=="Correct"]))

使用 dplyr 和 tidyverse,以及

correctRT <- c(mean(practice$RT[practice$Outcome=="Correct"]))

(我确信这不是正确的方法)并且似乎没有任何工作。我是一个完全的新手,正在使用这个数据集来学习如何使用 R 进行统计,但无法用 R 找到任何答案。

标签: rdplyr

解决方案


在 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().


推荐阅读