我有一個這樣設定的資料集:
| 鳥 | 結果 |
|---|---|
| 一種 | 0 |
| 一種 | 0 |
| 一種 | 1 |
| 一種 | 1 |
| 乙 | 0 |
| 乙 | 1 |
| 乙 | 0 |
| C | 1 |
| C | 1 |
| C | 1 |
對于最后結果為 0 的所有鳥,我洗掉了所有尾隨的 0 和尾隨 0 之前的最后一個 1。我使用了以下代碼:
detect <- detect %>%
group_by(bird) %>%
mutate(new = cumsum(outcome)) %>%
filter(if(last(outcome) == 0) new <max(new) else TRUE) %>%
ungroup %>%
select(-new)
這段代碼作業得很好并產生了這個輸出:
| 鳥 | 結果 |
|---|---|
| 一種 | 0 |
| 一種 | 0 |
| 一種 | 1 |
| 一種 | 1 |
| 乙 | 0 |
| C | 1 |
| C | 1 |
| C | 1 |
只有 b 被修剪,因為它是唯一最后一次剩余觀察值為 0 的鳥。我想擴展代碼并為最后一次觀察值為 1 的鳥修剪最后 1 次觀察值。我希望輸出看起來像這樣:
| 鳥 | 結果 |
|---|---|
| 一種 | 0 |
| 一種 | 0 |
| 一種 | 1 |
| 乙 | 0 |
| C | 1 |
| C | 1 |
最后剩余觀察值為 1 的鳥將其最后 1 移除,而最后剩余觀察值為 0 的鳥將尾隨 0 和 0 之前的最后 1 移除。但是,我希望這種修剪同時運行,而不是一個接一個。例如,如果我有一只結果為 0001100 的鳥,我希望洗掉尾隨的 0 和最后一個 1 以生成 0001。我不想再次修剪它并洗掉最后剩下的 1。
uj5u.com熱心網友回復:
detect %>%
group_by(bird) %>%
mutate(new = cumsum(outcome)) %>%
filter(if(last(outcome) == 0) new < max(new) else TRUE) %>%
select(-new) %>%
filter(!(row_number() == n() & last(outcome) == 1)) %>%
ungroup()
# A tibble: 6 × 2
# bird outcome
# <chr> <int>
# 1 a 0
# 2 a 0
# 3 a 1
# 4 b 0
# 5 c 1
# 6 c 1
使用這些資料:
detect = read.table(text = 'bird outcome
a 0
a 0
a 1
a 1
b 0
b 1
b 0
c 1
c 1
c 1', header = T)
uj5u.com熱心網友回復:
你可以這樣做:
df %>%
group_by(bird) %>%
summarise(outcome = str_remove(str_c(outcome, collapse = ""), "(10 $)|(1$)")) %>%
separate_rows(outcome, sep="(?<=.)(?=.)", convert = TRUE)
# A tibble: 6 x 2
bird outcome
<chr> <int>
1 a 0
2 a 0
3 a 1
4 b 0
5 c 1
6 c 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358122.html
標籤:r
上一篇:計算日期之間的實體數
