Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的特定行之后获取下一行?_R_Loops_If Statement - Fatal编程技术网

在R中的特定行之后获取下一行?

在R中的特定行之后获取下一行?,r,loops,if-statement,R,Loops,If Statement,我在一个数据帧中有一列“rank”,我想添加得到1的行,然后检查它们后面是否有2。如何在for循环中执行此操作?我知道这可以通过if语句来实现,但我不知道如何获取正确的行?我需要基本上删除排名为1的行,并且没有排名为2的行 示例输出: Rank Values 1 e 2 er 3 gr 4 ie 5 wv 1 iop 1 ni 2 ot 3 kr 4 lw (由于其排名为1,没有后续2,因此

我在一个数据帧中有一列“rank”,我想添加得到1的行,然后检查它们后面是否有2。如何在for循环中执行此操作?我知道这可以通过if语句来实现,但我不知道如何获取正确的行?我需要基本上删除排名为1的行,并且没有排名为2的行

示例输出:

Rank   Values
1      e
2      er
3      gr
4      ie
5      wv
1      iop
1      ni
2      ot
3      kr
4      lw
(由于其排名为1,没有后续2,因此已删除iop)

或使用
数据。表

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
在哪里

setDT(data)[!(Rank == 1 & shift(Rank, fill = 0, type = "lead") != 2)]
数据
或使用
数据。表

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
在哪里

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

data查找循环时:

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")
输出:

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,])   
  } 
}

在查找循环时:

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")
输出:

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,])   
  } 
}

循环样式

  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,]
我们将遍历数据帧,并注意需要在向量中删除哪些行

一个示例数据帧

     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
这是非常简洁,但没有表达


关于这一点,请阅读以下中循环样式

  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,]
我们将遍历数据帧,并注意需要在向量中删除哪些行

一个示例数据帧

     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
这是非常简洁,但没有表达


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

我们也可以使用
tidyverse

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

我们也可以使用
tidyverse

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

@内森:我用loop:you check为你添加了代码?@nathan:我用loop:you check为你添加了代码?