根据其他列值删除不增加的行

Remove not increasing rows based on other columns values

我在 R 上有一个数据框,我想删除第 3 列中所有未增加的行。每一行都必须高于或等于前一行。但我的主要困难是行必须根据其他列 1 和 2 增加。在我的示例中,Column3 必须根据 Column1 [A-B] 和 2 [1:4] 增加。这里,Column1 [B] 必须删除,因为 199>197.

PS : 很多地块和日期对应的CO2测量值。当CO2测量时不单调的时候,测量是错误的。

Column1 Column2 Column3
A 1 200
A 2 202
A 3 204
A 4 207
B 1 199
B 2 197
B 3 200
B 4 202

可能有更简单的方法,但这里有一个方法:

如果你想删除违反条件的观察(这里,其中有值197的观察),试试这个:

df %>% group_by(Column1) %>% 
  mutate(del = (lag(Column3) > Column3)) %>% 
  filter(!del|is.na(del)) %>% 
  select(-del)

输出:

# Column1 Column2 Column3
# <chr>     <int>   <int>
# 1 A             1     200
# 2 A             2     202
# 3 A             3     204
# 4 A             4     207
# 5 B             1     199
# 6 B             3     200
# 7 B             4     202

如果要从不满足条件的给定组(此处为组 b)中删除所有观察值

df %>% group_by(Column1) %>% 
  mutate(del = any((lag(Column3) > Column3), na.rm = TRUE)) %>% 
  filter(!del) %>% 
  select(-del)

输出:

# Column1 Column2 Column3
# <chr>     <int>   <int>
# 1 A             1     200
# 2 A             2     202
# 3 A             3     204
# 4 A             4     207

本例中使用的数据:

df <- read.table(text = "Column1    Column2 Column3
A   1   200
A   2   202
A   3   204
A   4   207
B   1   199
B   2   197
B   3   200
B   4   202", header = TRUE)

您可以使用 diff() 来确定一个组是否在增加。

subset(df, ave(Column3, Column1, FUN = \(x) all(diff(x) >= 0)) == 1)

#   Column1 Column2 Column3
# 1       A       1     200
# 2       A       2     202
# 3       A       3     204
# 4       A       4     207

它的dplyr相当于:

library(dplyr)

df %>%
  group_by(Column1) %>%
  filter(all(diff(Column3) >= 0)) %>%
  ungroup()