【发布时间】:2017-09-07 02:32:09
【问题描述】:
数据
> 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 数据集中做错了什么?
【问题讨论】:
-
如果你拿差来检查,它们不完全是 0.1
-
我们这里有一些不错的浮点数。
sprintf("%0.20f", diff(veh$Time))