[英]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.