簡體   English   中英

如何僅為一種結果類型計算新數據框?

[英]How can I calculate a new dataframe only for one outcome type?

我正在處理一些涉及參與者執行認知任務的數據,這些任務測量他們的結果(正確或不正確)和反應時間(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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM