我有一个这样的数据表:
a group
1: 1 a
2: 2 a
3: 3 a
4: 4 a
5: 5 a
6: 6 a
可以从以下代码创建样本:
structure(list(a = 1:100, group = c("a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b",
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b",
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b",
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b",
"b", "b", "b", "b")), .Names = c("a", "group"), row.names = c(NA,
-100L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000004790788>)
对于每组中的每一行,我想:
a
列a
中的值,滞后2并减去1 a
中的值,滞后4并减去1 a
中的值,滞后6并减去1 因此,对于第1-6行,我会NA
,然后是7/5 + 7/3 + 7/1 - 3
,8/6 + 8/4 + 8/2 - 3
,9/7 + 9/5 + 9/3 - 3
,10/8 + 10/6 + 10/4 - 3
因此,根据第一个块中报告的表格,我想获得一个新列,比如说metric_1
,它会在第10行显示值2.416667
请注意,a
列中的值实际上与行号不对应,但会进行一些测量。
最终输出将如下所示:
a group metric_1
1: 1 a NA
2: 2 a NA
3: 3 a NA
4: 4 a NA
5: 5 a NA
6: 6 a NA
7: 7 a 7.733333
8: 8 a 4.333333
9: 9 a 3.085714
10: 10 a 2.416667
我已经尝试了Reduce
的某些版本,如果我需要在向量中加总一些值,它就像冠军一样,但是我无法调整它以使我能够像这样进行划分。
答案 0 :(得分:0)
我不确定这是否正是您正在寻找的,但也许会有所帮助:
library(dplyr)
the_data %>% group_by(group) %>%
mutate(metric_1 = (a/lag(a, 2)-1)+( a/lag(a,4)-1) + (a/lag(a, 6) - 1 )) %>%
ungroup()
答案 1 :(得分:0)
找到了一个可能的解决方案:
dt[,
list(a, Reduce(`+`, lapply(shift(a, seq(2, 6, by = 2)),
function(x) a/x - 1))),
by = "group"]
但它很慢。