【问题标题】:Splitting ID based on values根据值拆分 ID
【发布时间】:2017-03-10 10:15:41
【问题描述】:

我有一个包含 p 列和 n 行的大型 data.frame。
我想更改 ID,即如果获得值 1,则拆分帧。但是,对于每个 ID,该值可能会出现多次,因此变得很棘手。
我正在考虑下订单,所以每次 df$Value==1 时,该行都应该​​有 df$order==1(next,2... 直到再次出现 df$value==1)

# Example data
df <- data.frame(ID= c(rep(1,3), rep(2,7), rep(3,5)),
             Value= c(0,0,1,
                      0,0,1,0,1,1,0,
                      0,0,1,0,1))

# Desired result
df <- data.frame(ID= c(rep(1,3), rep(2,3), rep(2.1,2), rep(2.2,1),rep(2.3,1), rep(3,3), rep(3.1,2)),
             Value= c(0,0,1,
                      0,0,1,
                      0,1,
                      1,
                      0,
                      0,0,1,
                      0,1))

# Alternative desired result
df <- data.frame(ID= c(rep(2,3), rep(2.1,2), rep(2.2,1),rep(2.3,1), rep(3,3), rep(3.1,2)),
             Value= c(0,0,1,
                      0,1,
                      1,
                      0,
                      0,0,1,
                      0,1))

我已经尝试过这样做:

df %>% group_by(ID) %>% mutate(Order= seq(from=Value[1], to=which(Value==1), by=1))

但它并没有真正给我想要的。
有什么建议吗?

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    这是一个使用data.table的选项

    library(data.table)
    setDT(df)[, ID := seq(0, 1, by = 0.1)[shift(cumsum(Value==1), fill=0)+1] + ID, ID]
    

    或者dplyr也一样

    library(dplyr)
    df %>%
      group_by(ID) %>%
      mutate(ID1 = seq(0, 1, by = 0.1)[lag(cumsum(Value==1), default=0)+1] + ID) %>%
      ungroup() %>%
      mutate(ID = ID1) %>%
      select(-ID1)
    # A tibble: 15 × 2
    #      ID Value
    #   <dbl> <dbl>
    #1    1.0     0
    #2    1.0     0
    #3    1.0     1
    #4    2.0     0
    #5    2.0     0
    #6    2.0     1
    #7    2.1     0
    #8    2.1     1
    #9    2.2     1
    #10   2.3     0
    #11   3.0     0
    #12   3.0     0
    #13   3.0     1
    #14   3.1     0
    #15   3.1     1
    

    【讨论】:

    • 我对 data.table 不是很有信心。但我了解 dplyr 解决方案,这是非常聪明的做法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多