将变量与向量解进行比较

时间:2019-01-21 11:04:25

标签: r purrr

我正面临以下问题。我有一个包含多个问题的测试,并且主题的答案记录在变量Q1至Q3中(实际上我还有很多问题)

URI

我将向量中问​​题1、2和3的正确答案

test <- tibble(
  Q1 = c(4, 5, 6), 
  Q2 = c(3, 2, 1),  
  Q3 = c(4, 1, 3))

现在我创建一个新变量,该变量计算每个主题的正确答案的数量。我的猜测是它可以与map2函数一起使用,但是我不知道该怎么做。

6 个答案:

答案 0 :(得分:7)

我们可以在base R中创建一个逻辑矩阵,然后执行rowSums来计算正确答案的数量

test$newCol <- rowSums(test == correct_answers[col(test)])

或者使用tidyverse,将map2reduce结合使用,以在数据集中创建“ newCol”

library(tidyverse)
test %>% 
      mutate(newCol = map2(., correct_answers, `==`) %>% 
                       reduce(`+`))

答案 1 :(得分:5)

这行吗?

library(purrr)
test %>% 
  map_dbl(~sum(.x%in%correct_answers))

答案 2 :(得分:5)

我们可以使用mapply然后执行rowSums

df$ans <- rowSums(mapply(`==`, test, correct_answers))

使用map2可能类似于

library(purrr)
map2(test, correct_answers, function(x, y) sum(x == y))

答案 3 :(得分:4)

rowSums(apply(test, 2, `==`, correct_answers))

答案 4 :(得分:1)

上面已经有很多好的答案。为了澄清起见,您的帖子以两种不同的方式进行了解释。

如果向量correct_answers的每个问题有一个正确答案(即正确的Q1答案是4而只有4)。然后,坚持使用purrr,您可以选择以下答案:

library(tidyverse)
test %>% 
      mutate(newCol = map2(., correct_answers, `==`) %>% 
                       reduce(`+`))

如果您说correct_answers对于任何问题都有正确的答案,那么这个就是那个:

library(purrr)
test %>% 
  map_dbl(~sum(.x%in%correct_answers))

答案 5 :(得分:0)

我认为这是基于R的?sweep()的完美用例-

test$n_correct <- rowSums(sweep(test, 2, correct_answers, "=="))

# A tibble: 3 x 4
     Q1    Q2    Q3 n_correct
  <dbl> <dbl> <dbl>     <dbl>
1     4     3     4         1
2     5     2     1         1
3     6     1     3         1