我正在做由10个逐渐增加的项目组成的心理测试。分数可以是 0(错误)、1(几乎正确)、2(正确答案)。所以,问题 2 比问题 1 更难。问题 3 比问题 2 和 1 更难,等等。人们不会回答所有问题,而只会回答一些问题。
评分系统应该这样做:
-- 第一个“2”之前的所有列均应替换为“2”。 [我们认为参与者能够正确回答这个问题]
-- 最后一个“0”之后的所有列都应替换为“0”。 【我们认为该考生这道题不会通过】
我尝试了所有解决方案,但没有成功。我想继续使用 tidyverse,如果可能的话使用 mutate
数据框是
df = structure(list(x1_2 = c(NA, 2, NA, NA, NA, NA), x2_2 = c(NA, 2,
2, 2, 2, 2), x3_2 = c(2, 2, 1, 1, 2, 2), x4_2 = c(2, 1, 0, 2,
0, 0), x5_2 = c(2, 1, NA, 2, NA, NA)), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"))
df
您可以定义一个辅助函数,使用
max.col()
、col()
和 is.na()
查找要替换的值的索引,并使用 <
或 >
进行左侧和右侧替换:
rf <- function(cols, value, FUN) {
replace(pick({{ cols }}),
FUN(col(pick({{ cols }})), max.col(cbind(pick({{ cols }}) == value & !is.na(pick({{ cols }})), TRUE), "first")) & is.na(pick({{ cols }})),
value)
}
df |>
mutate(rf(ends_with("_2"), 2, `<`),
rf(ends_with("_2"), 0, `>`))
# A tibble: 6 × 5
x1_2 x2_2 x3_2 x4_2 x5_2
<dbl> <dbl> <dbl> <dbl> <dbl>
1 2 2 2 2 2
2 2 2 2 1 1
3 2 2 1 0 0
4 2 2 1 2 2
5 2 2 2 0 0
6 2 2 2 0 0