在 R 中,从第二列的第一次出现更改数据框列

in R, change dataframe column from the first occurence of a second column

我有一个与此类似的数据框:

set.seed(1004)
x <- c(sort(rnorm(40)),sort(rnorm(20)),
       sort(rnorm(40)),sort(rnorm(20)))
x[30:40] <- -x[30:40]+1
x[90:100] <- -x[90:100]+1

y <- c(rep('a',times = 60),rep('b',times = 60))
z <- 1:length(x)

df <- data.frame(z, x, y)

我想根据xy新建一个专栏。我想要的是在每个 y 子组中(即示例中的 'a' 和 'b'),第一次出现 x > 0,此额外列的下一行应该有相同的值(因子)。而且,即使在第一次出现后再次 x < 0

最后我想要这样的东西:

df$y2 <- c(rep('0', times = 20), rep('1', times = 40), rep('0', times = 19), rep('1', times = 41))

到目前为止我试过这个:

library(magrittr)
df %<>% 
  mutate(y2 = case_when(
    x < 0 ~ '0',
    x >= 0 ~ '1'
  ))

但我遗漏了一个参数,因此即使 x 再次变为负数,y2 仍保持为“1”。

我想要的图形表示是:到目前为止我有这个:

虽然我想要这个:

df <- data.frame(z, x, y)
df$y2 <- c(rep('0', times = 20), rep('1', times = 40), rep('0', times = 19), rep('1', times = 41))

library(magrittr)
df %<>% 
  group_by(y) %>% 
  mutate(y3 = cummax(ifelse(x < 0, 0, 1))) #by taking cummax, y3 will always be 1 after the first x > 0 for each group y

table(df$y2 == df$y3, useNA = "always")

TRUE <NA> 
 120    0 

我在这里使用函数 Position 来查找满足特定条件的第一次出现的位置。在这种情况下 x > 0。 然后我根据这个位置创建一个包含新列值的向量。

library(dplyr)
library(magrittr)

createNewValues <- function(x){
  splitPoint <- Position(function(x) x>0, x)
  return(rep(c(0, 1), times = c(splitPoint-1, length(x)-splitPoint+1)))
}

df %<>% 
  group_by(y) %>% 
  mutate(y2 = createNewValues(x))