根据其他列值删除不增加的行
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()
我在 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()