[英]Counting (character) values in a data frame in function of two variables
數據:
(實際數據要大得多,但為了清楚起見,我只是在這里展示一個表示)
我有以下向量
Response <- c('blue', 'yellow', 'red', 'yellow', 'blue', 'red', 'red', 'blue', 'yellow', 'green', 'yellow', 'yellow', 'green')
ZN <- c('C', 'B', 'A','C', 'B', 'A', 'C', 'B', 'A', 'B', 'A', 'B', 'A')
Stimuli <- c('e','e','e','e','e','e','e','e','e','c','c','c','c')
在此數據框中組織:
test <- data.frame(Response, ZN, Stimuli)
解釋:刺激“e”有三個層次(C;B;A),刺激“c”有兩個層次(B;A)。 參與者可以為這些級別分配某些顏色。
目標:針對刺激“e”確定參與者在每個級別(C、B、A)中選擇藍色、紅色或黃色的次數,例如,在示例中,級別 C 選擇了 2 次藍色,選擇了黃色一次)。 對於具有兩個級別(B,A)的刺激“c”也是如此。
一種(繁瑣的)方法是在 ZN =='C' 和 Stimuli == e 時將布魯斯的數量相加
sum(data$Response == 'blue' | data$ZN =='C' | data$Stimuli == e)
然后為黃色和紅色(刺激“e”唯一可能的顏色)執行此操作。 然后為 ZN =='B' 和 ZN =='A' 復制此過程。
必須有更聰明的方法來做到這一點..我只是 R 的新手,如果問題太愚蠢,對不起。 最后,我想要的信息如下:
Stimuli e
ZN = C
2 blue
1 yellow
ZN = B
2 yellow
1 red
ZN = A
2 red
1 yellow
謝謝!
我們可以使用分組來做這種類型的總結。 但是,使用tidyverse
,我們可以使用count()
,這節省了我們必須先編寫group_by()
的步驟。 相反,我們只在count()
語句中列出我們想要分組的列。
library(tidyverse)
test %>% count(Response, Stimuli, ZN) %>%
arrange(Stimuli, ZN, Response)
# A tibble: 11 x 4
# Groups: Response, Stimuli, ZN [11]
Response Stimuli ZN n
<fct> <fct> <fct> <int>
1 green c A 1
2 yellow c A 1
3 green c B 1
4 yellow c B 1
5 red e A 2
6 yellow e A 1
7 blue e B 2
8 yellow e B 1
9 blue e C 1
10 red e C 1
11 yellow e C 1
這是一個單線基礎 R 解決方案,它以更接近您要求的格式給出答案:
lapply(split(test, test$ZN), function(x) t(table(x$Stimuli, x$Response)))
#> $A
#>
#> c e
#> green 1 0
#> red 0 2
#> yellow 1 1
#>
#> $B
#>
#> c e
#> blue 0 2
#> green 1 0
#> yellow 1 1
#>
#> $C
#>
#> e
#> blue 1
#> red 1
#> yellow 1
由代表 package (v2.0.1) 於 2022 年 1 月 28 日創建
您的目標以非常具體的方式陳述,因此我不確定您實際需要解決什么問題。
聽起來您想計算刺激、ZN 和響應的可能組合的出現次數。 如果是這種情況,那么只需將它們全部分組並讓dplyr::n
根據分組進行計數。 這可能是一個有用的參考。
您可能需要運行install.packages("tidyverse")
然后library(tidyverse)
才能工作。
data %>%
dplyr::group_by(Response, ZN, Stimuli) %>%
dplyr::summarise(
count = dplyr::n(),
.groups = "drop")
tibble::as_tibble()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.