我有一个序列数据集,我试图根据观察的日期差异(应该是&£;)和其他三个条件来确定序列的顺序。
我选择使用mutate创建一个订单列,其值是一个计数器,根据两个记录之间的日期差异对记录进行排序,以及观察是否满足特定条件(mycheckfunc())。
dt <- dt %>%
group_by(obsID) %>%
arrange(row_index)%>%
mutate(order = ifelse(row_index == 1, 1,
ifelse(dateDiff > 3, 1,
ifelse(mycheckfunc(lag(x), y, z,), 0, 1))))
mycheck如下所示,单独测试后可以使用
mycheckfunc<- function(x, y, z){
if ((x %in% c(49,50,51,52,53,84)) |
(y %in% c(49,50,51,52,53,87)) |
(z %in% c("2B",81))){
if(x == 19 & y == 51 & z == 21){
return (FALSE)
}else{
return (TRUE)
}
}else{
return (FALSE)
}
}
我想要实现的目标如下:
obsID row_index dateDiff x y z order
1 1 NA 19 20 15 1
1 2 0 19 51 21 1
1 3 2 49 1 1 2
1 4 0 1 49 1 3
2 1 NA 19 21 2B 1
2 2 381 .. .. .. 1
我无法使用上面的代码更新订单,所以我决定使用以下输出,只标记被识别为序列中第一个的观察结果。
obsID row_index dateDiff x y z order
1 1 NA 19 20 15 1
1 2 0 19 51 21 1
1 3 2 49 1 1 0
1 4 0 1 49 1 0
2 1 NA 19 21 2B 1
2 2 381 .. .. .. 1
但是我收到以下错误和警告
Error in mutate_impl(.data, dots) : missing value where TRUE/FALSE needed In addition: Warning messages: 1: In if (x %in% c(49, 50, 51, 52, 53, 84) | y %in% c(49, 50, 51, 52, : the condition has length > 1 and only the first element will be used
要注意:我在dateDiff列中只有NA,我认为我已经控制了mutate中的第二个ifelse语句。我不知道为什么mycheckfunc会返回NAs ..请帮助。
我已经使用了mutate,并意识到lag()导致了问题。但是因为我只获得了具有前辈的行的延迟,所以它不应该为null ..仍然是stomped。我有下面的追溯
14: stop(list(message = "missing value where TRUE/FALSE needed",
call = mutate_impl(.data, dots), cppstack = NULL))
13: .Call("dplyr_mutate_impl", PACKAGE = "dplyr", df, dots)
12: mutate_impl(.data, dots)
11: mutate_.tbl_df(.data, .dots = lazyeval::lazy_dots(...))
10: mutate_(.data, .dots = lazyeval::lazy_dots(...))
9: mutate(., spOrder = ifelse(row_index == 1, 1, ifelse(dateDiff >
好的,问题是菜鸟错误:在自定义向量中使用if语句。 mutate使用向量化的元素列表,而我的函数使用if语句,因此不会将其转换为ifelse语句。
然而,是否有人知道我如何根据上述条件更新订单以获得表1?