Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于检测数据帧中连续差异的R函数是什么?_R - Fatal编程技术网

用于检测数据帧中连续差异的R函数是什么?

用于检测数据帧中连续差异的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

我在R中使用了下面的代码,它工作得非常好。更准确地说,我将每个时间段的cluster_id与最后一个cluster_ref进行比较,以查看它们在一行中有两个不同的时段(数据是按基金编号组织的)。但是,我想把它调整为5个周期。但要让它发挥作用是不可能的。你知道我如何修改这个代码来解决我的问题吗

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