【发布时间】:2021-08-29 17:04:30
【问题描述】:
我如何从这样的数据框出发:
| ID | X | Y |
|---|---|---|
| 1 | 4 | 6 |
| 1 | 6 | 5 |
| 1 | 8 | 4 |
| 1 | 9 | 6 |
| 2 | 6 | 4 |
| 2 | 7 | 5 |
| 2 | 3 | 9 |
到这里:
| ID | X | Y |
|---|---|---|
| 1 | 4 | 6 |
| 1 | 6 | 5 |
| 2 | 6 | 4 |
在本例中,我想删除每个 ID 的最后 2 行。
【问题讨论】:
我如何从这样的数据框出发:
| ID | X | Y |
|---|---|---|
| 1 | 4 | 6 |
| 1 | 6 | 5 |
| 1 | 8 | 4 |
| 1 | 9 | 6 |
| 2 | 6 | 4 |
| 2 | 7 | 5 |
| 2 | 3 | 9 |
到这里:
| ID | X | Y |
|---|---|---|
| 1 | 4 | 6 |
| 1 | 6 | 5 |
| 2 | 6 | 4 |
在本例中,我想删除每个 ID 的最后 2 行。
【问题讨论】:
您可以使用以下解决方案:
library(dplyr)
df %>%
group_by(ID) %>%
filter(between(row_number(), 1, n()-2))
# A tibble: 3 x 3
# Groups: ID [2]
ID X Y
<int> <int> <int>
1 1 4 6
2 1 6 5
3 2 6 4
或者这个:
df %>%
group_by(ID) %>%
slice(1:(n()-2))
# A tibble: 3 x 3
# Groups: ID [2]
ID X Y
<int> <int> <int>
1 1 4 6
2 1 6 5
3 2 6 4
【讨论】:
head 的选项在slice 中使用
library(dplyr)
df %>%
group_by(ID) %>%
slice(head(row_number(), -2)) %>%
ungroup
-输出
# A tibble: 3 x 3
ID X Y
<int> <int> <int>
1 1 4 6
2 1 6 5
3 2 6 4
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), X = c(4L,
6L, 8L, 9L, 6L, 7L, 3L), Y = c(6L, 5L, 4L, 6L, 4L, 5L, 9L)),
class = "data.frame", row.names = c(NA,
-7L))
【讨论】:
你可以使用:
library(dplyr)
df %>%
group_by(ID) %>%
filter(row_number() <= n()-2)
输出:
ID X Y
<int> <int> <int>
1 1 4 6
2 1 6 5
3 2 6 4
【讨论】: