dplyr如何在列排序顺序更改时插入NA值

dplyr如何在列排序顺序更改时插入NA值,r,sorting,if-statement,dplyr,R,Sorting,If Statement,Dplyr,当列值从递增顺序更改为混合顺序时,我试图找到一种插入NA值的简单方法。但如果在这个混合有序行之后逻辑上继续增加顺序,那么也可以保留这些行 如果所有行没有递增顺序,请将这些行值替换为NA。(指所有混合排序的行) 此外,任何可以在其行中保留排序序列至少5个数字的列都可以通过(可以将其行保留为包含有序部分的行)。否则,替换那些无法通过此逻辑的行 我最好使用dplyr执行此过程。我试着这么做,但没想到:( 这是一个相当牵强的解决方案……它适用于以前的输出,但不适用于当前的C5:它将在第一次匹配到一系列5

当列值从
递增
顺序更改为混合顺序时,我试图找到一种插入
NA
值的简单方法。但如果在这个混合有序行之后逻辑上继续增加顺序,那么也可以保留这些行

如果所有行没有递增顺序,请将这些行值替换为
NA
。(指所有混合排序的行)

此外,任何可以在其行中保留排序序列至少5个数字的列都可以通过(可以将其行保留为包含有序部分的行)。否则,替换那些无法通过此逻辑的行

我最好使用
dplyr
执行此过程。我试着这么做,但没想到:(


这是一个相当牵强的解决方案……它适用于以前的输出,但不适用于当前的C5:它将在第一次匹配到一系列5个连续递增的值之前删除任何值

  • 找出变量中是否有一系列5个递增值。将值与
    lag
    进行比较。使用
    rle
    查找序列5
  • 如果没有序列,则返回一个NA向量
    length=length(var)
  • 否则
  • 将每个值与前一个值进行比较,如果较差,则删除
  • 如果上一个值已被删除,请再次通过以与上一个未删除的值进行比较。如果较低,请删除。删除值时重复此操作
  • 代码:

    我使用了这个数据集(对C5重复set.seed)

    C1=c(1:10,7,8,11,12)
    C2=c(2:12,7,13,12)
    种子集(123)
    C3=样品(1:14)
    C4=c(1:14)
    种子集(456)
    C5=c(样品(1:9),5,6,7,8,10)
    
    dt为什么dt$C5[1]
    变成了
    NA
    ?我本来以为1会留在那里。(这不是我唯一不明白的事,我通过了)@Tensibai通过意味着如果至少5行可以在该C5列显示递增顺序序列,那么可以保留它们。其他行应该是
    NA
    ,所以你只能保持5个连续的块(增加)行?很抱歉,您的预期输出很难与输入匹配,逻辑也不清楚me@Tensibai如果是这样的话,如果逻辑顺序发生了变化,你能至少给出一个答案吗?你应该修正关于你输入的预期输出。正如我所理解的,你的问题C5行应该是c(1,NA,2,NA,NA,NA,3,5,6,NA,NA,NA,7,8,10)或者可能是c(1,NA,2,NA,NA,NA,NA,NA,3,NA,NA,NA,5,6,7,8,10)或者是一整晚我都不知道该选哪一个exactly@scoa谢谢你花时间和精力写这么复杂的代码。顺便问一下,你怎么能写下这种我做不到的逻辑流程?你有学习的建议书或wep页面吗?@scoa,如果我想把这个
    co
    函数推广到
    decreas如果要更改顺序,您需要在每次将
    v
    lag(v)
    var
    To
    lag(var)
    var[p]>lag(var[p])
    变为
    var[p]
    ,等等。
    是的。如果整个语句在一行中,则可以省略括号
    
    dt_new <- dt%>%
        mutate_each(funs(replace(., which(ifelse(.....
    
    set.seed(123) 
    C1 = c(1:10,7,8,11,12)
    C2 = c(2:12,7,13,12)
    C3 = sample(1:14)
    C4 = c(1:14)
    C5 = c(sample(1:9),5,6,7,8,10)
    
    dt <- data.frame(C1,C2,C3,C4,C5)
    
           C1 C2 C3 C4 C5
    #   1   1  2  5  1  1
    #   2   2  3 11  2  8
    #   3   3  4 14  3  2
    #   4   4  5 10  4  9
    #   5   5  6 13  5  7
    #   6   6  7  1  6  4
    #   7   7  8 12  7  3
    #   8   8  9  7  8  5
    #   9   9 10  4  9  6
    #   10 10 11  3 10  5
    #   11  7 12  6 11  6
    #   12  8  7  2 12  7 
    #   13 11 13  2 13  8
    #   14 12 12  9 14 10
    
           C1 C2 C3 C4 C5
    #   1   1  2 NA  1  1
    #   2   2  3 NA  2 NA
    #   3   3  4 NA  3  2 
    #   4   4  5 NA  4 NA
    #   5   5  6 NA  5 NA
    #   6   6  7 NA  6 NA
    #   7   7  8 NA  7  3
    #   8   8  9 NA  8 NA
    #   9   9 10 NA  9 NA
    #   10 10 11 NA 10 5
    #   11 NA 12 NA 11 6
    #   12 NA NA NA 12 7
    #   13 11 13 NA 13 8
    #   14 12 NA NA 14 9
    
    library(dplyr)
    library(zoo)
    
    co <- function(var){
      r <- rle(lag(var) < var)
      d <- data.frame(v=r$values,
                      l=r$lengths,
                      c=cumsum(r$lengths))
      idx <- which(d$l > 3 & d$v==TRUE)[1] - 1
      id <- d$c[idx]
    
    
      v <- rep(NA,length(var))
      if(!is.na(id)) {
        p <- id:length(v)
        v[p] <- ifelse(var[p] > lag(var[p]),
                                  var[p],
                                  NA)
        v[id] <- var[id]
    
        previous.na <- sum(is.na(lag(v[p])))
    
        if(previous.na > 1) {
          current.na <- 0
    
          while(current.na != previous.na)
          { 
            previous.na <- sum(is.na(v))
            v[p][is.na(lag(v[p]))][-1] <- ifelse(v[p][is.na(lag(v[p]))][-1] > lag(na.locf(v[p]))[is.na(lag(v[p]))][-1],
                                                 v[p][is.na(lag(v[p]))][-1],
                                                 NA)
            v[id] <- var[id]
            current.na <- sum(is.na(v))
          }
    
        }
      }
    
      print(var)
      return(v)
    }
    mutate_each(dt,funs = funs(co))
    
       C1 C2 C3 C4 C5
    1   1  2 NA  1 NA
    2   2  3 NA  2 NA
    3   3  4 NA  3 NA
    4   4  5 NA  4 NA
    5   5  6 NA  5 NA
    6   6  7 NA  6 NA
    7   7  8 NA  7 NA
    8   8  9 NA  8 NA
    9   9 10 NA  9 NA
    10 10 11 NA 10  5
    11 NA 12 NA 11  6
    12 NA NA NA 12  7
    13 11 13 NA 13  8
    14 12 NA NA 14 10
    
    C1 = c(1:10,7,8,11,12)
    C2 = c(2:12,7,13,12)
    set.seed(123) 
    C3 = sample(1:14)
    C4 = c(1:14)
    set.seed(456) 
    C5 = c(sample(1:9),5,6,7,8,10)
    dt <- data.frame(C1,C2,C3,C4,C5)