我正在尝试创建一个新列,该新列对满足条件的每一列进行计数。那是因为我想总结硕士论文中每个参与者的正确答案的数量。我真的是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行应产生上面示例中显示的数字。
有人可以告诉我如何创建这样的变量吗?
非常感谢,谢谢 路卡
答案 0 :(得分:2)
我们可以通过使向量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))
答案 1 :(得分:0)
我们可以使用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')