【问题标题】:Dividing a dataset into two based on a column variable and the order matters根据列变量将数据集分为两部分,并且顺序很重要
【发布时间】:2014-06-29 05:31:54
【问题描述】:

我正在尝试将我的数据分成两个数据框。我根据 Y 的值和数据的顺序来分离我的数据。同样,我的数据目前的顺序正确。我想要一个新数据框中 Y=1 的所有观察值以及该组中先前行的所有零。我想要一个单独的数据框中的所有 Y=2 以及该数据集中先前行中的所有零。一个例子可能会有所帮助。

ID  X1  Y
1   2   0
1   2   0
1   2   1
2   4   0
2   4   0
2   4   2
2   5   1
3   6   2

但是,我想要 2 个如下所示的数据框:

ID   X1  Y
1    2   0
1    2   0
1    2   1
2    5   1

ID  X1  Y
2   4   0
2   4   0
2   4   2
3   6   2

我已经试过这段代码取出两个的

newdataset<-Final[Final$Status==2,]

但是,它只保留 2 并忽略所有相应的零。

任何帮助将不胜感激。

【问题讨论】:

    标签: r sorting dataframe


    【解决方案1】:

    您也可以使用图书馆(动物园)中的na.locf
    如果dd是数据集

    v1 <- dd$Y
    

    0 的值更改为NA

    v1[!v1] <- NA
    library(zoo)
    

    使用na.locf 创建索引。它将每个NA 替换为它之前的最近的非NA

    indx <- na.locf(v1,fromLast=T)
    

    拆分数据集

      split(dd, indx)
     #$`1`
     # ID X1 Y
     #1  1  2 0
     #2  1  2 0
     #3  1  2 1
     #7  2  5 1
    
     #$`2`
      #   ID X1 Y
      # 4  2  4 0
      # 5  2  4 0
      # 6  2  4 2
      # 8  3  6 2
    

    【讨论】:

      【解决方案2】:

      首先,我使用 cumsum 查看 Y 以查看 Y 的值何时不为零,并将每个块分配给一个新组。如果您的 data.frame 被称为dd,那么我们可以这样做

      g1 <- head(cumsum(c(0,dd$Y)!=0),-1)
      

      但这会将每次运行分配到不同的组,现在我们只需将它们重新分配回 1/2 组。我们可以使用ave 来执行此操作,以查看每组末尾的 Y 的非零值

      g2 <- ave(dd$Y, g1, FUN=function(x) tail(x,1))
      

      现在,有了适当的分区向量,我们就可以使用split 来创建单独的data.frames

      split(dd, g2)
      

      然后返回

      $`1`
        ID X1 Y
      1  1  2 0
      2  1  2 0
      3  1  2 1
      7  2  5 1
      
      $`2`
        ID X1 Y
      4  2  4 0
      5  2  4 0
      6  2  4 2
      8  3  6 2
      

      根据需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 2022-07-08
        • 1970-01-01
        相关资源
        最近更新 更多