Функция R, которая подсчитывает строки при соблюдении условий - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь создать новый столбец, в котором будет учитываться каждый столбец, удовлетворяющий критериям. Это потому, что я хочу суммировать количество правильных ответов каждого участника моей магистерской диссертации. Я новичок в R и отчаянно нуждаюсь в помощи даже в простых задачах.

Например:

(Участник, Задача1, Задача2, Задача3; COUNT)

1 4 8 1; 1 |

2 3 8 7; 1 |

3 1 3 4; 2 |

4 5 6 4; 1 |

5 1 8 4; 3

В столбце COUNT должны быть подсчитаны все правильные ответы строк Task1-Task3. Если правильные ответы (1, 8, 4), в строке COUNT должны появиться числа, показанные в примере выше.

Кто-нибудь может сказать мне, как создать такую ​​переменную?

Очень признателен, спасибо Лука

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Мы можем использовать rowSums, сделав длину вектора c(1, 8, 4) такой же, как длина столбца «Задача», и сделать ==, и получить rowSums

i1 <- startsWith(names(df1), 'Task')
df1$COUNT <-   rowSums(df1[i1] ==  c(1, 8, 4)[col(df1[i1])])
df1$COUNT
#[1] 1 1 2 1 3

Или с помощью sweep

rowSums(sweep(df1[i1], 2, c(1, 8, 4), `==`))

Или другой вариант: apply

df1$COUNT <- apply(df1[i1], 1, function(x) sum(x == c(1, 8, 4)))

ПРИМЕЧАНИЕ. Ни одно из решений не требует внешнего пакета

данных

df1 <- data.frame(Participant = 1:5, Task1 = c(4, 3, 1, 5, 1),
   Task2 = c(8, 8, 3, 6, 8), Task3 = c(1, 7, 4, 4, 4))
0 голосов
/ 29 мая 2020

Мы можем использовать pmap_int из purrr для подсчета количества правильных ответов.

library(dplyr)

df %>% mutate(COUNT = purrr::pmap_int(select(., starts_with('Task')), 
                               ~sum(c(...) == c(1, 8, 4))))


#  Participant Task1 Task2 Task3 COUNT
#1           1     4     8     1     1
#2           2     3     8     7     1
#3           3     1     3     4     2
#4           4     5     6     4     1
#5           5     1     8     4     3

Другой вариант - получить данные в длинном формате, вычислить количество правильных ответов для каждого Participant и снова присоединить данные.

df1 %>%
  tidyr::pivot_longer(cols = starts_with('Task')) %>%
  group_by(Participant) %>%
  summarise(COUNT = sum(value == c(1, 8, 4))) %>%
  left_join(df1, by = 'Participant')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...