У меня есть данные следующим образом:
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
, который ИСТИНЕН, если type
переключается с FALSE
на TRUE
(и только наоборот). Я думал сделать:
setDT(datfake)
datfake <- setDT(datfake)[non_response != shift(non_response), new_col:= TRUE, by=type]
Код работает, но есть две проблемы:
Не прилипает к типу.
Как я написал, это также TRUE
, если оно идет от TRUE
до 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 TRUE
Желаемый результат:
В строке 4 есть изменение non_response для типа W
с FALSE
на TRUE
, поэтому в этом случае new_col
должно быть ИСТИНА.
Во всех остальных случаях оно должно быть ложным.
Таким образом, последняя строка в предыдущем выводе неверна, потому что X
в строке 2 тоже FALSE
. Так что там, где моя попытка имеет new_col
TRUE
, в строке 5 она должна быть ложной.
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
Как мне это написать?
@Maël, я пытался уточнить желаемый результат
Как насчет чего-то подобного?
datfake[, new_col:= non_response != shift(non_response), by=type]
Каков ваш ожидаемый результат в вашем примере?