在 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)
我想根据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'
))
但我遗漏了一个参数,因此即使 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))
我有一个与此类似的数据框:
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'
))
但我遗漏了一个参数,因此即使 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))