如果一列中的值没有以连续方式增加,如何从数据框中删除行

时间:2017-10-05 00:03:50

标签: r dataframe

我在R上有一个数据框,我想删除那些在B列中没有连续增加的行。我的意思是,每行中的值必须高于前一行但低于下一个。我不想根据B列对数据框进行排序,因为我想保留A列中的顺序。我想我可以用if语句执行此操作,但我没有足够的R经验,谢谢高级。

我拥有的是这个,我必须删除已加星标的值。

    int temp[] = { 0, (static_cast<Mixins*>(this)->GoImpl(), 0)... };

我需要这个:

A       B   
26.00   11158115 
27.00   16722714* 
27.08   11881252 
90.25   69428973 
90.27   69749777 
93.30   64207240* 
95.90   71428751 
96.00   71670964 
107.65  100385980 
107.75  226164158* 
107.8   103280320 

2 个答案:

答案 0 :(得分:0)

这是一个解决方案,有点像:

A <- c(26.00, 27.00, 27.08, 90.25, 90.27, 93.30, 95.90, 96.00, 107.65, 107.75, 107.8)
B <- c(11158115, 16722714, 11881252, 69428973, 69749777, 64207240, 71428751, 71670964, 100385980,
       226164158, 103280320)
d <- data.frame(A, B)
repeat {
   delta <- diff(d$B)
               # delta gives you the difference between successive values of B
               # delta[1] corresponds to the difference between B[2] and B[1]
   if(all(delta > 0)) {
      break
   }
   iWrong <- 1 + which(delta < 0)
               # '1 +' means that if the next value is not larger than the previous value
               # (delta is not positive), we delete the next value
               # you can remove '1+' and delete this value instead
   d <- d[-iWrong,]
}

我说&#34;有点&#34;因为我不清楚哪些行应该被删除。为什么要删除第2行而不是第3行?两者都会给你增加B值。通过我的解决方案,你将得到:

1   26.00  11158115
2   27.00  16722714
4   90.25  69428973
5   90.27  69749777
7   95.90  71428751
8   96.00  71670964
9  107.65 100385980
10 107.75 226164158

答案 1 :(得分:0)

我找不到更好的解决方案,但至少它有效。

df = read.table(text = "A,B 
26.00,11158115
27.00,16722714
27.08,11881252
90.25,69428973
90.27,69749777
93.30,64207240
95.90,71428751
96.00,71670964
107.65,100385980
107.75,226164158
107.8,103280320", header = TRUE, sep = ",", stringsAsFactors = FALSE)

r = 2
repeat {

    if ((df$B[r] < df$B[r-1] | df$B[r] > df$B[r+1]) & df$B[r-1] < df$B[r+1]) {
        df <- df[-r,]    
    } else {
        r = r + 1
    }

    if (r == nrow(df)) break
}

df

输出:

        A         B
1   26.00  11158115
3   27.08  11881252
4   90.25  69428973
5   90.27  69749777
7   95.90  71428751
8   96.00  71670964
9  107.65 100385980
11 107.80 103280320

说明:

我们从第二个元素遍历数据框的每一行(第一个元素始终对第一个元素有效)。然后,我们使用预期标准删除每一行:该值必须高于前一行并且低于下一行((B[r] < B[r-1] or B[r] > B[r+1]))。但是使用此条件我们无法获得预期结果,因此我们也验证了后续值高于前一个值(B[r-1] < df$B[r+1]