【问题标题】:Replacing Values in Rows based on Existence of Specific Value in Row根据行中特定值的存在替换行中的值
【发布时间】:2019-01-30 19:34:39
【问题描述】:

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

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" }

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      不同的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 的行的行号,则分配“完成”。最后,它将数据转换回原始格式。

      【讨论】:

        【解决方案3】:

        “老派”解决方案:

        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
        

        【讨论】:

          猜你喜欢
          • 2022-07-14
          • 2021-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-05
          • 1970-01-01
          • 2022-12-31
          • 1970-01-01
          相关资源
          最近更新 更多