r语言 - 如果一行放在组变量中的另一行之后,如何查找和删除该行?



我有长格式数据,如果将第2组中的每一行放在每个ID中第3组中的行之后,我希望删除该行。例如:

ID group value
1  1     43
1  2     2
1  3     6
1  4     20
2  1     24
2  3     5
2  2     16
2  4     19

进入:

ID group value
1  1     43
1  2     2
1  3     6
1  4     20
2  1     24
2  3     5
2  4     19

我停留在:

data %>%
group_by(id)

有什么想法吗?

使用dplyr中的lead()和用于筛选的标志变量尝试这种方法。lead()函数允许比较值,然后可以设置组值等于2的条件。这里的代码:

library(dplyr)
#Code
dfnew <- df %>% group_by(ID) %>%
mutate(Lead=lead(group),
Flag=ifelse(Lead-group>1 & group==2,1,0)) %>%
filter(Flag==0) %>% select(-c(Flag,Lead))

输出:

# A tibble: 7 x 3
# Groups:   ID [2]
ID group value
<int> <int> <int>
1     1     1    43
2     1     2     2
3     1     3     6
4     1     4    20
5     2     1    24
6     2     3     5
7     2     4    19

使用的一些数据:

#Data
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), group = c(1L, 
2L, 3L, 4L, 1L, 3L, 2L, 4L), value = c(43L, 2L, 6L, 20L, 24L, 
5L, 16L, 19L)), class = "data.frame", row.names = c(NA, -8L))

您也可以使用slice,如下所示:

library(dplyr)
df %>%
group_by(ID) %>%
slice(
if (any(which(group == 2) > which(group == 3))) 
-which(group == 2)[which(group == 2) > which(group == 3)] 
else 1:n()
)

输出:

# A tibble: 7 x 3
# Groups:   ID [2]
ID group value
<int> <int> <int>
1     1     1    43
2     1     2     2
3     1     3     6
4     1     4    20
5     2     1    24
6     2     3     5
7     2     4    19

这种方法不要求2紧跟在3之后。也可能出现多次2,如果它们出现在3之后,则会全部删除。

使用dplyr中的lag()可以执行以下操作。

data %>%
group_by(ID) %>%
mutate(lag = lag(group)) %>%
filter(!(group == 2 & lag == 3)) %>%
ungroup() %>%
select(-lag)
#      ID group value
#   <dbl> <dbl> <dbl>
# 1     1     1    43
# 2     1     2     2
# 3     1     3     6
# 4     1     4    20
# 5     2     1    24
# 6     2     3     5
# 7     2     4    19

数据

structure(list(ID = c(1, 1, 1, 1, 2, 2, 2, 2), group = c(1, 2, 
3, 4, 1, 3, 2, 4), value = c(43, 2, 6, 20, 24, 5, 16, 19)), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))

我们可以使用slice

library(dplyr)
df1 %>%
group_by(ID) %>% 
slice(setdiff(row_number(), intersect(match(2, group), match(3, lag(group)))))

-输出

# A tibble: 7 x 3
# Groups:   ID [2]
#     ID group value
#  <dbl> <dbl> <dbl>
#1     1     1    43
#2     1     2     2
#3     1     3     6
#4     1     4    20
#5     2     1    24
#6     2     3     5
#7     2     4    19

数据

df1 <- structure(list(ID = c(1, 1, 1, 1, 2, 2, 2, 2), group = c(1, 2, 
3, 4, 1, 3, 2, 4), value = c(43, 2, 6, 20, 24, 5, 16, 19)), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))

最新更新