Fish_ID | 实例 | 成功 | 第一次成功 |
---|---|---|---|
1 | 0 | 0 | 0 |
1 | 1 | 0 | 0 |
1 | 2 | 1 | 1 |
1 | 3 | 0 | 0 |
1 | 4 | 1 | 0 |
1 | 5 | 0 | 0 |
我有一个包含列“Fish_ID”、“Instance”和“Success”的数据框,我想创建一个列“First_Success”,仅在第一次成功时包含 1,否则每个 fish_ID 组包含 0。在实际数据中,我有多个 Fish_ID。这是一个例子。 我想出了这个代码:
mydata %>%
group_by(fish_ID) %>%
mutate(Fist_Success = ifelse(Success == 1, 1, 0))
但是使用此代码,它计算所有等于 1 的成功值,我只想将第一次成功作为“First_Success”列的 1,其余为同一 fish_ID 组中的 0。我将不胜感激任何建议。非常感谢!
有很多方法可以做到这一点。在下面的这个例子中,我从成功首先等于 1 的行中的实例值中减去 1
df %>%
group_by(fish_ID) %>%
mutate(First_Success = +(Instance == min(which(Success==1))-1))
另一种方法是使用
which.max()
,像这样:
group_by(df, fish_ID) %>%
mutate(First_Success = +(row_number()== which.max(Success)))
输出:
fish_ID Instance Success First_Success
<int> <int> <int> <int>
1 1 0 0 0
2 1 1 0 0
3 1 2 1 1
4 1 3 0 0
5 1 4 1 0
6 1 5 0 0
您可以使用:
library(dplyr)
df %>%
mutate(First_Success = +(Success & cumsum(Success) == 1),
.by = Fish_ID)
# Fish_ID Instance Success First_Success
# 1 1 0 0 0
# 2 1 1 0 0
# 3 1 2 1 1
# 4 1 3 0 0
# 5 1 4 1 0
# 6 1 5 0 0
@langtang的建议也很棒:
df %>%
mutate(First_Success = (cumsum(Success) == 1) * Success,
.by = Fish_ID)
df <- read.table(text =
"Fish_ID Instance Success
1 0 0
1 1 0
1 2 1
1 3 0
1 4 1
1 5 0", header = TRUE)