1) rleid / ave Используя данные, воспроизводимые в примечании в конце, и используя rleid
в пакете data.table, мы определяем функцию x1_na
, которая заменяет все элементыего векторный аргумент с NA кроме первого и затем применяет его с ave
:
library(data.table)
x1_na <- function(x) `length<-`(x[1], length(x))
transform(DF, x.mutate = ave(x.action, rleid(x.action), FUN = x1_na))
, давая:
x.id x.timestamp x.action x.mutate
71 1 1435114605 click click
72 1 1435114606 click <NA>
73 1 1435114659 click <NA>
74 1 1435114719 scroll scroll
75 1 1435114726 scroll <NA>
76 1 1435114780 scroll <NA>
77 1 1435155998 scroll <NA>
78 1 1435156059 scroll <NA>
79 1 1435156076 click click
80 1 1435156119 click <NA>
2) rleid / duplicated A вариацияиз вышеперечисленного будет:
transform(DF, x.mutate = replace(x.action, duplicated(rleid(x.action)), NA))
3) Base R Единственная неосновная часть из вышеперечисленного - rleid
, поэтому, если вам нужно решение Base R, используйте один извыше, но определите rleid
самостоятельно так:
rleid <- function(x) with(rle(x), rep(seq_along(lengths), lengths))
Примечание
Мы предполагаем, что вводом является следующее, показанное в воспроизводимой форме.В частности, обратите внимание, что последний столбец является символом (как указано в вопросе в разделе «Предыдущие попытки»).
Lines <- "
x.id x.timestamp x.action
71 1 1435114605 click
72 1 1435114606 click
73 1 1435114659 click
74 1 1435114719 scroll
75 1 1435114726 scroll
76 1 1435114780 scroll
77 1 1435155998 scroll
78 1 1435156059 scroll
79 1 1435156076 click
80 1 1435156119 click"
DF <- read.table(text = Lines, as.is = TRUE)