Это будет проблема с правильной NA
отправкой.Здесь NA
был создан путем присваивания только NA
.и по умолчанию это будет NA_logical_
.По какой-то причине cume_dist
внутри mutate
не распознает.Можно указать round
или использовать as.integer
, чтобы NA
был преобразован в правильный NA
new_df %>%
mutate(gain = round(gain), cume_dist = cume_dist(gain))
# A tibble: 6 x 2
# gain cume_dist
# <dbl> <dbl>
#1 0 0.6
#2 30 0.8
#3 36 1
#4 -13 0.2
#5 0 0.6
#6 NA NA
или преобразован в integer
new_df %>%
mutate(gain = as.integer(gain), cume_dist = cume_dist(gain))
Проблема заключается в том, что NA
не распознается в mutate
.Если мы проверим функцию, cume_dist
cume_dist
#function (x)
#{
# rank(x, ties.method = "max", na.last = "keep")/sum(!is.na(x))
#}
Она берет rank
и делит на количество не-NA элементов в этом столбце.Делая тот же код
new_df %>%
mutate(Cume_dist = rank(gain, ties.method = "max",
na.last = "keep")/sum(!is.na(gain)))
# A tibble: 6 x 2
# gain Cume_dist
# <dbl> <dbl>
#1 0 0.6
#2 30 0.8
#3 36 1
#4 -13 0.2
#5 0 0.6
#6 NA NA
Если мы изменим знаменатель на количество строк в наборе данных
new_df %>%
mutate(Cume_dist = rank(gain, ties.method = "max", na.last = "keep")/n())
# A tibble: 6 x 2
# gain Cume_dist
# <dbl> <dbl>
#1 0 0.5
#2 30 0.667
#3 36 0.833
#4 -13 0.167
#5 0 0.5
#6 NA NA
Это означает, что в пределах mutate
env происходят некоторые измененияс элементом NA
, взяв n()
вместо 5 в знаменателе
Обратите внимание, что это не проблема вне mutate
cume_dist(new_df$gain)
#[1] 0.6 0.8 1.0 0.2 0.6 NA
Теперь, если мы изменимNA
до NA_real_
(столбец двойной, и OP назначил NA
без суффикса. Таким образом, по умолчанию это будет NA_logical_
. Обычно это должно работать, но cume_dist
может иметь некоторую ошибку дляправильно определить его внутри mutate
).Давайте попробуем изменить NA
на NA_real_
new_df$gain[is.na(new_df$gain)] <- NA_real_
new_df %>%
mutate(Cume_dist = cume_dist(gain))
# A tibble: 6 x 2
# gain Cume_dist
# <dbl> <dbl>
#1 0 0.6
#2 30 0.8
#3 36 1
#4 -13 0.2
#5 0 0.6
#6 NA NA
data
df <- tibble(y = c(2, 3, 4, 1, 2, NA))
out1 <- mutate(df,
min_rank = min_rank(y),
pct_rank = percent_rank(y),
cume_dist = cume_dist(y)
)
flights_sml <- filter(flights, month == 3, day == 20)
r1 <- min(which(is.na(flights_sml$dep_delay)))
new_df <- flights_sml[c(9, (r1-4):r1), ]
new_df <- mutate(new_df,
gain = dep_delay - arr_delay)
new_df <- select(new_df, gain)