如果其他列从 FALSE 变为 TRUE,则按组创建值为 TRUE 的列

Creating a column which values are TRUE, if other column moves from FALSE to TRUE, by group

我有如下数据:

library(stringi)

datfake <- as.data.frame(runif(100, 0, 3000))
names(datfake)[1] <- "Inc"
datfake$type <- sample(LETTERS, 100, replace = TRUE)
datfake$province <- stri_rand_strings(100, 1, "[A-P]")
datfake$non_response <- sample(rep(c("TRUE","FALSE"),each=50),100,replace=FALSE)

           Inc type province non_response
1    693.55581    R        H        FALSE
2   2539.40434    X        B        FALSE
3    990.16946    W        I        FALSE
4    208.33514    W        I         TRUE
5   1600.92130    X        P        FALSE

我想创建一个列 new_col,如果 typeFALSE 切换到 TRUE(并且只有这样大约)。我想这样做:

setDT(datfake)
datfake <- setDT(datfake)[non_response != shift(non_response), new_col:= TRUE,  by=type]

代码运行,但是有两个问题:

  1. 不拘类型

  2. 我这样写,从TRUEFALSE也是TRUE

             Inc type province non_response           new_col
    1:  693.55581    R        H        FALSE               NA
    2: 2539.40434    X        B        FALSE               NA
    3:  990.16946    W        I        FALSE               NA
    4:  208.33514    W        I         TRUE             TRUE
    5: 1600.92130    X        P        FALSE             TRUE
    

期望的输出:

在第 4 行中,对于类型 W,non_response 从 FALSE 更改为 TRUE,因此在这种情况下,new_col 应该是 TRUE。

在所有其他情况下,它应该是错误的。

所以前面输出的最后一行是不正确的,因为第2行的X也是FALSE。所以我的尝试在第 5 行有 new_col TRUE,它应该是错误的。

         Inc type province non_response           new_col
1:  693.55581    R        H        FALSE               NA
2: 2539.40434    X        B        FALSE               NA
3:  990.16946    W        I        FALSE               NA
4:  208.33514    W        I         TRUE             TRUE
5: 1600.92130    X        P        FALSE             FALSE

这个应该怎么写?

这样的事情怎么样?

datfake[, new_col:= non_response != shift(non_response), by=type]