使用 tidyverse 循环或迭代我的数据框来替换第一个特定值之前和特定值之后的所有值

问题描述 投票:0回答:1

我正在做由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

dataframe

r loops iterator iteration tidyverse
1个回答
0
投票

您可以定义一个辅助函数,使用

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
© www.soinside.com 2019 - 2024. All rights reserved.