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

R 根据行中存在的特定值替换行中的值,r,for-loop,mutate,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出现在一行中时,该行中的所有剩余值应显示为

以下是我正在使用的数据集:

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循环、mutate in tidy等循环遍历我的数据集并读取每一行,直到它在该行中找到值1(如果适用)。如果它发现该值为1,则让它将该行中的所有剩余值替换为“Complete”,因为这应该是默认值

数据应该是这样的:

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" }
对于(i in 1:nrow(data)){position检查此解决方案:

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)
库(dplyr)
图书馆(tidyr)
df%>%
聚集(键,val,x1:x5)%>%
分组依据(ID)%>%
变异(
检查=val==1,
检查=总和(检查),
val=如果有其他(
val<1&check==1 | val==1&check>1,
"完成",,
as.字符(val)
)
) %>%
选择(-check)%>%
排列(键,val)

一种不同的
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
df%>%
聚集(变量,值,-ID)%>%
分组依据(ID)%>%
变异(val=ifelse(row_number()>row_number(val==“1”),“Complete”,val))%>%
价差(var,val)
内径x1x2x3x4x5
1 1 0 0 1完成-完成
2 0 0.5 0.5 1完成
3     3 0     0.25  0.25  .5       .75     
4 0 0.5 1完成
在第一步中,它将数据从宽格式转换为长格式。第二步,如果行数(每组)大于值为1的行数,它将指定“完成”。最后,它将数据转换回原始格式。

一个“老派”解决方案:

ncol