根据行中特定值的存在替换行中的值

时间:2019-01-30 19:34:40

标签: r for-loop mutate

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

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循环,整洁的变异等方式循环遍历我的数据集并读取每一行,直到找到该行中的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" }

3 个答案:

答案 0 :(得分:1)

检查此解决方案:

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)

答案 1 :(得分:1)

另一种tidyverse方法可能是:

df %>%
 gather(var, val, -ID) %>%
 group_by(ID) %>%
 mutate(val = ifelse(row_number() > row_number(val == "1"), "Complete", val)) %>%
 spread(var, val)

     ID x1    x2    x3    x4       x5      
  <int> <chr> <chr> <chr> <chr>    <chr>   
1     1 0     0     1     Complete Complete
2     2 0     0.5   0.5   1        Complete
3     3 0     0.25  0.25  .5       .75     
4     4 0     0.5   1     Complete Complete

第一步,它将数据从宽格式转换为长格式。其次,如果行数(每组)大于具有值1的行的行号,则将其分配为“完整”。最后,它将数据转换回原始格式。

答案 2 :(得分:0)

“老派”解决方案:

ncol <- dim(data)[2]
for (i in 1:nrow(data)){
  position <- which(data[i, 2:ncol] == 1) + 1 
  if (length(position) != 0) {
    data[i, (position + 1):ncol] <- "Complete"
  }
}
data

  ID x1   x2   x3       x4       x5
1  1  0 0.00 1.00 Complete Complete
2  2  0 0.50 0.50        1 Complete
3  3  0 0.25 0.25       .5      .75
4  4  0 0.50 1.00 Complete Complete