假设我有一个值的向量,例如:
我希望您能创建一个新的向量,对于每个元素,它包含自上次出现以来的元素数量。因此,对于上面的向量,
(其中
例如,第一个和第二个A分别在位置1和3,相差2;第三个和第四个A分别在位置4和11,相差7,以此类推。
是否有预先构建的管道兼容函数可以执行此操作?
我拼凑了这个函数来演示:
A C A B A C C B B C C A A A B B B B C A
我希望您能创建一个新的向量,对于每个元素,它包含自上次出现以来的元素数量。因此,对于上面的向量,
NA NA 2 NA 2 4 1 4 1 3 1 7 1 1 6 1 1 1 8 6
(其中
NA
表示这是第一次看到该元素。)例如,第一个和第二个A分别在位置1和3,相差2;第三个和第四个A分别在位置4和11,相差7,以此类推。
是否有预先构建的管道兼容函数可以执行此操作?
我拼凑了这个函数来演示:
# For reproducibility
set.seed(1)
# Example vector
x = sample(LETTERS[1:3], size = 20, replace = TRUE)
compute_lag_counts = function(x, first_time = NA){
# return vector to fill
lag_counts = rep(-1, length(x))
# values to match
vals = unique(x)
# find all positions of all elements in the target vector
match_list = grr::matches(vals, x, list = TRUE)
# compute the lags, then put them in the appropriate place in the return vector
for(i in seq_along(match_list))
lag_counts[x == vals[i]] = c(first_time, diff(sort(match_list[[i]])))
# return vector
return(lag_counts)
}
compute_lag_counts(x)
虽然它似乎完成了它应该完成的任务,但我更愿意使用别人高效、经过充分测试的解决方案!我的搜索结果为空,这让我感到惊讶,因为这似乎是一个常见的任务。
data.table
替代方案,但你比我更快:dt = data.table(x)
;dt[ , d := .I - shift(.I), x]
。 - Henrik