Разделение кадра данных на основе критерия и построение графика с использованием ggplot2 - PullRequest
1 голос
/ 24 июня 2019

Я все еще новичок в R, и у меня есть проблема с отображением моих данных, которая выглядит примерно так:

set.seed(529)
test <- data.frame(StartPos = rep(1:10, times = 10),
                   Response = c(sample(c("H", "M", "W"), 50, replace=T),
                              sample(c("M", "W"), 50, replace = T)),
                   Velocity = c(sample(c(-36, 36), 100, replace = T)))
head(test)

на основе критериев.

Данные состоят из 100 строк с начальными позициями 3-5 и 10-11 (каждая случайным образом генерируется 10 раз (примерно 20 раз, как стартовая позиция 3, которая может существовать 20 раз)). Каждая из стартовых позиций также имеет ответ, который может быть H для Hit, M для Miss или W для неправильного. Возможно, что для определенной начальной позиции нет H. Существует также столбец Velocity со значениями -36 и 36, которые описывают направление стимула, который начинался на определенных StartPos (-36 справа, 36 слева).

Я хочу нанести на график количество ударов с каждой стороны (HitR и HitL) для каждого начального положения на барплоте (например, 17 ударов из 20 для StartPos 3, 7 из них - удары справа - остальные 10 Хиты слева) - Это похоже на мой предыдущий пост с 1 дополнительным условием: ggplot2 альтернативы для заполнения барплотов, вхождение фактора в несколько строк

Мне удалось посчитать количество хитов. Но без критерия, был ли это удар вправо или влево.

Я выполнил это с помощью следующего кода:

hit_counts <- test %>%
  mutate(StartPos = as.factor(StartPos)) %>% 
  filter(Response == "H") %>% 
  count(StartPos, .drop = FALSE) 

hit_counts

ggplot(hit_counts, aes(x = StartPos,y=n)) +
  geom_col()+labs(x="StartPos",y="Hitrate")

Сюжет выглядел так:

enter image description here

Это близко к тому, что мне нужно, но я не могу придумать, как разделить или суммировать Хиты в зависимости от направления движения, а затем построить их.

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Что-то вроде этого?

set.seed(529)
test <- data.frame(StartPos = rep(1:10, times = 10),
                   Response = c(sample(c("H", "M", "W"), 50, replace=T),
                             sample(c("M", "W"), 50, replace = T)),
                   Velocity = c(sample(c(-36, 36), 100, replace = T)))
head(test)

library(dplyr)
library(ggplot2)

test <- test %>% 
    mutate(Direction = case_when( # add direction 
        Velocity < 0 ~ "Right",
        Velocity > 0 ~ "Left",
        TRUE ~ "None")) %>% 
    filter(Response=="H") %>% 
    group_by(StartPos, Direction) %>% # for each combination 
    mutate(Count=n()) # count

ggplot() +
    geom_col(data=test, mapping=aes(x=StartPos, fill=Direction, y=Count)) +
    labs(x="StartPos", y="Hitrate")

Создано в 2019-06-25 пакетом представлением (v0.3.0)

0 голосов
/ 24 июня 2019

Вот еще один пример, я работал над этим в прошлом.

`mydata2= subset (mydata, col_name == "HitR", select = c("col1", "col2", "col4"))`

Тогда вы должны быть в состоянии построить или даже сделать подзаговоры "HitR" и "HitL" для сравнения. Дайте мне знать, если это поможет.

...