我有一个来自论坛的庞大数据库(包含数千个问题),人们在这里回答问题,而他们的回答是否被接受。如果某人回答不止一次,我需要将他们的答案合并在一起,并在他们第一次回答时将它们放在第一位。这是我正在处理的虚构示例
这是数据框
df1 <- data.frame(
questionID = c(1,1,1,1,2,2,2),
userID = c(101, 101, 101, 102, 102,103,102),
accepted=c(0,0,1,0,0,1,0),
answer=c('text1','text2','text3','text4','text5','text6','text7'),
time=c('12:00','12:30',"1:00","1:30","2:00","2:30","3:00"))
由于userID(101)回答了问题ID(1)3次,并且第三个答案被接受,因此我需要将答案串联起来,并将其放在最早的时间(即12:00)。对于userID(102),谁回答了两次却都没有被接受,同样的事情。结果将如下所示(带有输出数据框):
out <- data.frame(
questionID = c(1,1,2,2),
userID = c(101, 102, 102,103),
accepted=c(1,0,0,1),
answer=c('text1+text2+text3','text4','text5+text7','text6'),
time=c('12:00',"1:30","2:00","2:30"))
我已经看到了针对此类问题的一些解决方案,但似乎都无法解决这种精确的情况。在R中有某种方法可以做到这一点吗?
我们可以summarise
通过paste
将“答案”放入单个字符串中,同时在进行分组之后获得last
“接受”和first
“时间”值
library(dplyr)
library(stringr)
df1 %>%
group_by(questionID, userID) %>%
summarise(accepted = last(accepted),
answer = str_c(answer, collapse="+"),
time = first(time))
# A tibble: 4 x 5
# Groups: questionID [2]
# questionID userID accepted answer time
# <dbl> <dbl> <dbl> <chr> <fct>
#1 1 101 1 text1+text2+text3 12:00
#2 1 102 0 text4 1:30
#3 2 102 0 text5+text7 2:00
#4 2 103 1 text6 2:30
或使用 data.table
library(data.table)
setDT(df1)[, .(accepted = last(accepted),
answer = paste(answer, collapse= "+"), time = first(time), .(questionID, userID)]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句