创建表示第一次成功的二进制列

问题描述 投票:0回答:2
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。我将不胜感激任何建议。非常感谢!

r if-statement dplyr binary-data mutate
2个回答
2
投票

有很多方法可以做到这一点。在下面的这个例子中,我从成功首先等于 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

1
投票

您可以使用:

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)
© www.soinside.com 2019 - 2024. All rights reserved.