我有一个与此相似的数据框:
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)
我想根据x
和y
新建一列。我想要的是在每个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'
))
但是我错过了一个论点,因此即使y2
再次变为负数,x
仍保持为'1'。
我想要的是一个图形表示:到目前为止,我已经有了:
我想要这个:
答案 0 :(得分: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
答案 1 :(得分:0)
在这里,我正在使用位置功能来查找满足特定条件的第一次出现的位置。在这种情况下,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))