在R中,从第二个列的第一个出现的位置更改dataframe列

时间:2018-06-28 08:36:21

标签: r dataframe find-occurrences

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

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'
  ))

但是我错过了一个论点,因此即使y2再次变为负数,x仍保持为'1'。

我想要的是一个图形表示:到目前为止,我已经有了:

enter image description here

我想要这个:

enter image description here

2 个答案:

答案 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))