Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R获取具有相同但较少其他列值的唯一列值的计数_R_Dataframe - Fatal编程技术网

R获取具有相同但较少其他列值的唯一列值的计数

R获取具有相同但较少其他列值的唯一列值的计数,r,dataframe,R,Dataframe,我在R中有一个数据框,其中包含测试中的学生ID和问题ID。学生按顺序回答问题,但不必回答每个问题。对于每一个学生和问题,我试图得到的是有多少独特的学生作为这个学生回答了前面的问题(questID

我在R中有一个数据框,其中包含测试中的学生ID和问题ID。学生按顺序回答问题,但不必回答每个问题。对于每一个学生和问题,我试图得到的是有多少独特的学生作为这个学生回答了前面的问题(questID<当前questID)。下面是一个具有一些预期计数的数据帧示例。例如,问题3中的学生1回答了之前的两个问题(1和2),另外两个独特的学生(学生2和3)回答了这些问题。你知道我如何在R中获得这些计数吗?

数据

DF <- data.frame(studentID = c(rep(1, 4), rep(2,3), rep(3, 2)),
                 questID = c(1, 2, 3, 4, 1 , 2, 4, 2, 5))

DF一个粗略的方法是创建一个函数,该函数计算
questID
值的
studentID
的不同数量

library(dplyr)

get_counts <- function(x) {
    DF %>%
     group_by(studentID) %>%
     filter(any(questID %in% x)) %>%
     pull(studentID) %>% n_distinct - 1
}

请使用
dput()
提供您的数据。我不清楚您到底在找什么。也许一个期望结果的示例会有所帮助。实际上,count列是我正在寻找的-我只是将count作为输出的示例显示…Thanks我仍然不清楚显示的预期输出。对于ID为1的学生和ID为3的问题,ID为1的学生之前回答了两个问题(到这里为止还可以),但ID为3的学生从未回答过问题1。对于ID为3的学生,问题5中的最后一个条目呢。当没有人回答问题5时,情况如何。不清楚如何计算
count
。谢谢..好的..如果你看看回答问题5的学生3,但在他们回答问题5之前,他们回答了问题2。现在另外两名学生(学生ID为1和2)也回答了问题2。所以,关键不在于有多少学生回答了当前的问题(5个),而在于学生回答了之前的问题。我希望这是有道理的。让我试一试
DF %>%
  group_by(studentID) %>%
  mutate(count = purrr::map_dbl(row_number(), ~get_counts(questID[1:(.x - 1)])), 
         count = replace(count, 1, 0))

#  studentID questID count
#      <dbl>   <dbl> <dbl>
#1         1       1     0
#2         1       2     1
#3         1       3     2
#4         1       4     2
#5         2       1     0
#6         2       2     1
#7         2       4     2
#8         3       2     0
#9         3       5     2