首页 > 解决方案 > 根据行中特定值的存在替换行中的值

问题描述

这是我正在使用的数据集:

ID    x1    x2    x3    x4        x5        
1     0     0     1     .25       .25
2     0     .5    .5    1         Complete
3     0     .25   .25   .5        .75 
4     0     .5    1     Complete  Complete

当您看到值 1 连续出现时,该行中的所有剩余值都应显示为“完成”。我正在尝试解决此数据中的一个问题,您可以看到至少有一行不遵循该规则(第 1 行)。我想找到一种方法,或者通过 for 循环,在 tidy 中变异等来循环浏览我的数据集并读取每一行,直到它在该行中找到 1 的值(如果适用)。如果它发现该值为 1,则让它在该行中将所有剩余值替换为“完成”,因为无论如何这应该是默认值。

这应该是数据的样子:

ID    x1    x2    x3    x4        x5        
1     0     0     1     Complete  Complete
2     0     .5    .5    1         Complete
3     0     .25   .25   .5        .75 
4     0     .5    1     Complete  Complete

我现在拥有的是:

for(i in 1:nrow(data)){ position <- which(data[i, ]==1)
                        data[,position+1] <- "Complete" }

标签: rfor-loopdplyr

解决方案


检查此解决方案:

library(dplyr)
library(tidyr)
df %>%
  gather(key, val, x1:x5) %>%
  group_by(ID) %>%
  mutate(
    check = val == 1,
    check = cumsum(check),
    val = if_else(
      val < 1 & check == 1 | val == 1 & check > 1,
      'Complete',
      as.character(val)
    )
  ) %>%
  select(-check) %>%
  spread(key, val)

推荐阅读