我有长格式数据,如果将第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"))