找到组内第一个 TRUE

问题描述 投票:0回答:1

我想将第一个

TRUE
的位置保存在每个
level
内的
id
变量中。我正在做以下事情:

library(tibble)
library(knitr)
library(kableExtra)
library(tidyverse)
library(lme4)
library(multiwayvcov)
library(lmtest)

data <- data %>%
  group_by(id) %>%
  mutate(first_true = min(which(data$level == TRUE))) %>%
  ungroup()

但是,

first_true
的结果对于所有
id
都是相同的。
group_by(id)
不起作用。知道会发生什么吗?

dplyr group mutate
1个回答
0
投票

您没有提供数据来让我们重现您的问题,但我在这里提供了一些适合您的描述的内容:

data <- tribble(~id, ~level,
        1,   FALSE,
        1,   FALSE,
        1,   TRUE,
        1,   FALSE,
        2,   FALSE,
        2,   FALSE,
        2,   TRUE,
        2,   TRUE,
        3,   FALSE,
        3,   TRUE,
        3,   TRUE,
        3,   FALSE
)

在此示例中,我们创建一个列,其中包含每个 TRUE 值的位置,稍后,我们创建另一个列,其中每个 id 的 TRUE 值的位置较小。

result <- data |> 
  # add row numberd for each id
  group_by(id) |> 
  mutate(position = row_number()) |> 
  # create column with the position of each TRUE value
  mutate(true_position = ifelse(level == TRUE, position, NA)) |> 
  # create another column with the smaller position of each TRUE value
  mutate(min_position = min(true_position, na.rm = TRUE))

您还可以过滤以仅获取每组的第一个 TRUE:

result |>
  group_by(id) |> 
  filter(true_position == min(true_position, na.rm = TRUE))

# A tibble: 3 × 5
# Groups:   id [3]
     id level position true_position min_position
  <dbl> <lgl>    <int>         <int>        <int>
1     1 TRUE         3             3            3
2     2 TRUE         3             3            3
3     3 TRUE         2             2            2
© www.soinside.com 2019 - 2024. All rights reserved.