基于其他列的值删除不增加的行。

3
我在R中有一个数据帧,想要删除第三列不是递增的所有行。每一行都必须高于或等于前面一行。但我的主要困难在于,行必须按照其他第1和第2列递增。在这个例子中,第3列必须根据第1列[A-B]和2 [1:4]递增。在这里,第1列[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

1
你能否提供一个你期望的输出示例?我有点困惑。 - jpsmith
我想删除所有199/197/200/202行,因为它们形成了一个不增加的系列,这意味着样本B(列1)存在问题。 - ArctiCareX
那么,所有值不增加的组中的所有观察结果都是如此吗?因此,在这种情况下,所有来自B组的结果? - jpsmith
是的,我编辑了我的帖子以添加更多上下文。我尝试编写一个循环,但它并不成功。 - ArctiCareX
好的,请看下面我回答的后半部分是否解决了你的问题。 - jpsmith
是的,非常感谢!第二个选项解决了我的问题。 - ArctiCareX
2个回答

2
你可以使用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()

1

也许有更简单的方法,但是这里提供一种方式:

如果你只想要删除违反条件的观测值(在这里,它的值为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)


any()中加入na.rm = TRUE以避免NA,这样filter(!del|is.na(del))可以简化为filter(!del),即df %>% group_by(Column1) %>% mutate(del = any(lag(Column3) > Column3, na.rm = TRUE)) %>% filter(!del) - Darren Tsai
谢谢您的改进!我已经编辑过了以反映这一点。 - jpsmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接