我有如下数据:
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
如果type
从FALSE
切换到TRUE
,我想创建一个列new_col
,它是TRUE(仅此而已(。我想做:
setDT(datfake)
datfake <- setDT(datfake)[non_response != shift(non_response), new_col:= TRUE, by=type]
代码运行,但有两个问题:
它不符合类型。
按照我写的方式,如果从
TRUE
到FALSE
,它也是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
。因此,如果我的尝试有new_col
TRUE
,那么在第5行中,它应该是false。
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]