【问题标题】:Get the next row after a specific one in R?在R中的特定行之后获取下一行?
【发布时间】:2018-08-01 13:57:37
【问题描述】:
Rank   Values
1      e
2      er
3      gr
4      ie
5      wv
1      iop
1      ni
2      ot
3      kr
4      lw

我在数据框中有一列“排名”,我想添加获取 1 的行并检查它们之后是否有 2。如何在 for 循环中执行此操作?我知道这可以通过 if 语句来完成我只是不确定如何获取正确的行?我需要基本上删除排名为 1 且没有以下排名为 2 的行。

示例输出:

Rank   NewCol
1      e       
2      er
3      gr
4      ie
5      wv
1      ni
2      ot
3      kr
4      lw

(去掉 iop,因为它的等级是 1,后面没有 2)

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:
    data[!(data$Rank == 1 & c(data$Rank[-1], 0) != 2), ]
       Rank Values
    1     1      e
    2     2     er
    3     3     gr
    4     4     ie
    5     5     wv
    7     1     ni
    8     2     ot
    9     3     kr
    10    4     lw
    

    或者使用data.table:

    setDT(data)[!(Rank == 1 & shift(Rank, fill = 0, type = "lead") != 2)]
    

    在哪里

    data <- structure(list(Rank = c(1L, 2L, 3L, 4L, 5L, 1L, 1L, 2L, 3L, 4L
    ), Values = c("e", "er", "gr", "ie", "wv", "iop", "ni", "ot", 
    "kr", "lw")), row.names = c(NA, -10L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      当你在寻找循环时:

      data=c()
      for(i in 1:nrow(df)){
       if(i!=nrow(df)){
          if(df$Rank[i]==1 & df$Rank[i+1]!=2){
           # Ignore the iteration if it doesn't have a following rank 2
          }
          else{
          data=rbind(data,df[i,]) # Else rbind the data to data.frame
          }  
        }
        else{
         data=rbind(data,df[i,])   
        } 
      }
      

      输出:

           Rank Values
       1    1      e
       2    2     er
       3    3     gr
       4    4     ie
       5    5     wv
       7    1     ni
       8    2     ot
       9    3     kr
      10    4     lw
      

      【讨论】:

      • @nathan:我已经使用循环为你添加了代码:你能检查一下吗?
      【解决方案3】:

      我们也可以使用tidyverse

      library(tidyverse)
      df1 %>% 
        filter(!(Rank ==1 & lead(Rank, default = last(Rank)) != 2))
      #   Rank Values
      #1    1      e
      #2    2     er
      #3    3     gr
      #4    4     ie
      #5    5     wv
      #6    1     ni
      #7    2     ot
      #8    3     kr
      #9    4     lw
      

      【讨论】:

        【解决方案4】:

        循环样式

        我们将遍历数据框并注意我们需要删除向量中的哪些行。

        一个示例数据框

          (df <- data.frame(
            Rank = c(1,2,3,1,2,1,1,2,1,1,1,2,3),
            Values = letters[1:13]
          ))
        

        这里是代码

          rows.to.delete <- c()
          for( i in seq_along(df$Rank) ) {
            if(df[i + 1, "Rank"] == 1 & df[i, "Rank"] == 1){
              rows.to.delete <- c(rows.to.delete, i)
            }
          }
        
          df[-rows.to.delete,]
        

        括号样式

          df[ ! (df$Rank == 1 & df$Rank[-1] == 1), ]
        

        这很简洁,但没有那么富有表现力......

        关于这一点,请在 Medium 上阅读以下post

        【讨论】:

          猜你喜欢
          • 2013-01-22
          • 2014-10-30
          • 2018-12-16
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 2022-12-24
          • 1970-01-01
          • 2023-02-06
          相关资源
          最近更新 更多