代码之家  ›  专栏  ›  技术社区  ›  amrrs

寻找dplyr中当前变异变量的最大值

  •  2
  • amrrs  · 技术社区  · 8 年前

    在解决这个问题的时候 Identify duplicates of one value with different values in another column ; 我觉得解决方案更接近了,但我做不到,因为 dplyr mutate max 当我使用 max(ID) 在下面的代码中,并没有后置变异值(如递归)。

    我尝试的代码:

    df <- read.table(text = 'ID     Address
    1      X
                     1      X  
                     1      Y
                     2      Z
                     2      Z
                     3      A
                     3      B
                     4      C
                     4      D
                     4      E
                     5      F
                     5      F
                     5      F
                     ', header= T, stringsAsFactors = F)
    
    
    df %>% group_by(ID) %>% mutate(flag = ifelse(lag(Address)==Address,F,T))  %>% 
      mutate(flag = ifelse(is.na(flag),F,flag)) %>% ungroup() %>% 
      mutate(newID = ifelse(flag | is.na(flag), max(ID)+1,ID))%>% 
      select(ID = newID,Address)
    

    接收输出:

    # A tibble: 13 x 2
          ID Address
       <dbl>   <chr>
     1     1       X
     2     1       X
     3     6       Y
     4     2       Z
     5     2       Z
     6     3       A
     7     6       B
     8     4       C
     9     6       D
    10     6       E
    11     5       F
    12     5       F
    13     5       F
    

    预期输出:

    ID    Address
    1      X
    1      X  
    6      Y
    2      Z
    2      Z
    3      A
    7      B
    4      C
    8      D
    9      E
    5      F
    5      F
    5      F
    

    任何帮助都将不胜感激!

    编辑:

    理想代码:我应该能够使用的地方 newID 这是要使用的当前变异变量。

    > df %>% group_by(ID) %>% mutate(flag = ifelse(lag(Address)==Address,F,T))  %>% 
    +     mutate(flag = ifelse(is.na(flag),F,flag)) %>% ungroup() %>% 
    +     mutate(newID = ifelse(flag | is.na(flag), max(newID)+1,ID))%>% 
    +     select(ID = newID,Address)
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   akrun    8 年前

    max(ID) + 1 第二个问题是 ifelse “是”和“否”需要等长向量。在下面的解决方案中,我们替换 max(ID) + seq_len(sum(flag)) 而不是 习惯于 replace

    df %>%
       group_by(ID) %>% 
       mutate(flag = lag(Address, default = Address[1])!= Address) %>%
       ungroup() %>% 
       mutate(newID = replace(ID, flag, max(ID) + seq_len(sum(flag))))%>% 
       select(ID = newID,Address)
    # A tibble: 13 x 2
    #      ID Address
    #   <dbl>   <chr>
    # 1     1       X
    # 2     1       X
    # 3     6       Y
    # 4     2       Z
    # 5     2       Z
    # 6     3       A
    # 7     7       B
    # 8     4       C
    # 9     8       D
    #10     9       E
    #11     5       F
    #12     5       F
    #13     5       F
    

    此外,两个 如果其他 创建“标志”的语句可以替换为单个语句