用于检测数据帧中连续差异的R函数是什么?
我在R中使用了下面的代码,它工作得非常好。更准确地说,我将每个时间段的cluster_id与最后一个cluster_ref进行比较,以查看它们在一行中有两个不同的时段(数据是按基金编号组织的)。但是,我想把它调整为5个周期。但要让它发挥作用是不可能的。你知道我如何修改这个代码来解决我的问题吗用于检测数据帧中连续差异的R函数是什么?,r,R,我在R中使用了下面的代码,它工作得非常好。更准确地说,我将每个时间段的cluster_id与最后一个cluster_ref进行比较,以查看它们在一行中有两个不同的时段(数据是按基金编号组织的)。但是,我想把它调整为5个周期。但要让它发挥作用是不可能的。你知道我如何修改这个代码来解决我的问题吗 get_output <- function(mon, ref){ exp <- !is.na(Cluster_id) & !map2_lgl(Cluster_id, last(C
get_output <- function(mon, ref){
exp <- !is.na(Cluster_id) & !map2_lgl(Cluster_id, last(Cluster_ref), identical)
as.integer(exp & lag(exp, default = FALSE))
}
df %>%
arrange(Fund_number, rolling_window) %>%
group_by(Fund_number) %>%
mutate(Deviation = get_output(Cluster_id, Cluster_ref)) %>%
ungroup()
这就是我想要的。
如您所见,数据是按基金编号组织的。然后我查看每个基金的最后一个cluster\u ref(因此每8行一次),并将其与每个基金的每个cluster\u id进行比较。只要一行中至少有5个句点不同,我就有1个句点,如果不是0的话。因此,对于每个基金,我比较第8个cluster_ref和第1行到第8行的cluster_id
上面的代码可以实现这一点,但有两个时间段
多谢各位
Vanie在
数据表中,我们可以在集群id
值上使用rleid
library(data.table)
setDT(df)[, temp := rleid(last(Cluster_ref) != Cluster_id), Fund_number]
df[, output := +(seq_along(Cluster_ref) >= 5), .(Fund_number, temp)]
df[, temp := NULL]
df
# rolling_window Fund_number Cluster_id Cluster_ref Expected_output output
# 1: 1 1 10 10 0 0
# 2: 2 1 10 10 0 0
# 3: 3 1 8 9 0 0
# 4: 4 1 8 8 0 0
# 5: 5 1 7 7 0 0
# 6: 6 1 8 8 0 0
# 7: 7 1 8 NA 1 1
# 8: 8 1 7 NA 1 1
# 9: 9 1 7 10 1 1
#10: 10 1 10 10 0 0
#11: 1 2 NA NA 0 0
#12: 2 2 NA 3 0 0
#13: 3 2 3 3 0 0
#14: 4 2 2 5 0 0
#15: 5 2 2 NA 0 0
#16: 6 2 2 4 0 0
#17: 7 2 2 4 1 1
#18: 8 2 5 5 0 0
#19: 9 2 4 5 0 0
#20: 10 2 3 5 0 0
非常感谢@Ronak Shah,但我没有在我的真实文件中得到预期的结果(我编辑了可复制的示例)。事实上,更准确地说,我希望对每个基金编号,将最后一行cluster_ref(因此这里每10个观察值)与所有cluster I_d行(第1行到第10行)进行比较,然后从每个新基金编号开始。如果cluster\u id=cluster\u ref,那么我有0,因为没有偏差/差异。一旦偏差连续达到5,我就有1,直到cluster_id=cluster_ref(对于NA值,它既不不同也不相等)。我怎样才能更改密码?@GauthierGolin我明白了。我已经更新了答案,你能看一下吗?我得到了预期的输出!所以感谢你的帮助@RonakShah!
library(data.table)
setDT(df)[, temp := rleid(last(Cluster_ref) != Cluster_id), Fund_number]
df[, output := +(seq_along(Cluster_ref) >= 5), .(Fund_number, temp)]
df[, temp := NULL]
df
# rolling_window Fund_number Cluster_id Cluster_ref Expected_output output
# 1: 1 1 10 10 0 0
# 2: 2 1 10 10 0 0
# 3: 3 1 8 9 0 0
# 4: 4 1 8 8 0 0
# 5: 5 1 7 7 0 0
# 6: 6 1 8 8 0 0
# 7: 7 1 8 NA 1 1
# 8: 8 1 7 NA 1 1
# 9: 9 1 7 10 1 1
#10: 10 1 10 10 0 0
#11: 1 2 NA NA 0 0
#12: 2 2 NA 3 0 0
#13: 3 2 3 3 0 0
#14: 4 2 2 5 0 0
#15: 5 2 2 NA 0 0
#16: 6 2 2 4 0 0
#17: 7 2 2 4 1 1
#18: 8 2 5 5 0 0
#19: 9 2 4 5 0 0
#20: 10 2 3 5 0 0