Dplyr R:缺少需要TRUE / FALSE的值“

时间:2018-04-26 14:37:53

标签: r dplyr mutate

我有一个序列数据集,我试图根据观察的日期差异(应该是&£;)和其他三个条件来确定序列的顺序。

我选择使用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?

0 个答案:

没有答案