ifelse()用mutate()产生错误的结果

时间:2017-04-11 15:35:34

标签: r dplyr

数据

> dput(veh)
structure(list(Time = c(138.6, 138.7, 138.8, 138.9, 139, 139.1, 
139.2, 139.3, 139.4, 139.5, 139.6, 139.7, 139.8, 139.9, 140, 
140.1, 140.2, 140.3, 140.4, 140.5, 140.6, 149.9, 150, 150.1, 
150.2)), .Names = "Time", row.names = c(NA, -25L), class = c("tbl_df", 
"tbl", "data.frame"))

在mutate()中使用ifelse()会产生错误的结果:

我发现了Time变量的差异。如果差异大于0.1,我希望将其标记为BIG。以下是我的尝试:

library(dplyr)
veh %>%
mutate(diff_t = c(NA, diff(Time))) %>%
mutate(act = ifelse(diff_t>0.1, "BIG", "NA"))   

# A tibble: 25 × 3
    Time diff_t   act
   <dbl>  <dbl> <chr>
1  138.6     NA  <NA>
2  138.7    0.1    NA
3  138.8    0.1   BIG
4  138.9    0.1    NA
5  139.0    0.1    NA
6  139.1    0.1    NA
7  139.2    0.1    NA
8  139.3    0.1   BIG
9  139.4    0.1    NA
10 139.5    0.1    NA
# ... with 15 more rows  

为什么0.1在此标记为BIG

在另一个数据集上尝试相同的代码会产生正确的结果:

foo <- data.frame(a = c(1:5, 8))
foo %>% 
mutate(diff_a = c(NA, diff(a))) %>% 
mutate(act = ifelse(diff_a>1, "BIG", "NA"))  

  a diff_a  act
1 1     NA <NA>
2 2      1   NA
3 3      1   NA
4 4      1   NA
5 5      1   NA
6 8      3  BIG 

我在veh数据集中做错了什么?

1 个答案:

答案 0 :(得分:1)

这些数字并不完全等于0.1。一个选项是round,然后尝试使用ifelse

veh %>% 
    mutate(diff_t = round(c(NA, diff(Time)),2), 
           act = ifelse(diff_t >= 0.1 & !is.na(diff_t), "BIG", NA))