gpt4 book ai didi

反转变量中非 NA 值的顺序

转载 作者:行者123 更新时间:2023-12-02 02:13:01 25 4
gpt4 key购买 nike

我有兴趣以整齐的方式反转具有 NA 值的列的值。

rev 调用在这里不起作用:

library(tidyverse)
tibble(
Which = LETTERS[1:11],
x = c( c(3,1,4,2,16), NA, NA, 4, rep(NA, 2), 10)) %>%
mutate(y = rev(x))

因为它完全反转了值(包括 NA)。

我本质上想要一个整洁的 mutate 命令(没有拆分/连接)来反转 Which 列的值,以便 E 的值为 1(最大值变为最小值)B 的值为 16(最小值变为最大值)等 - 以及 NA 值保持 NA(F、G、I 和 J)。

编辑:

一些答案​​没有达到预期的结果。该问题旨在有效地进行反向 (rev) 工作,同时保持 NA 就位。

@Moody_Mudskipper 对于没有重复的情况有一个解决方案,但是当有重复时它会失败,例如:

rev_na <- function(x) setNames(sort(x), sort(x, TRUE))[as.character(x)]

在这里工作:

tibble(
Which = LETTERS[1:11],
x = c( c(3,1,4,2,16), NA, NA, 4, rep(NA, 2), 10)) %>%
mutate(y = rev_na(x))

此处失败:

tibble(
Which = LETTERS[1:7],
x = c(3,1,9,9,9, 9, 10)
) %>% mutate(y = rev_na(x), z = rev(x))

最佳答案

如果你能容忍一点黑客行为:

tibble(
Which = LETTERS[1:11],
x = c( c(3,1,4,2,16), NA, NA, 4, rep(NA, 2), 10)) %>%
mutate(y = setNames(sort(x), sort(x, TRUE))[as.character(x)])
#> # A tibble: 11 x 3
#> Which x y
#> <chr> <dbl> <dbl>
#> 1 A 3 4
#> 2 B 1 16
#> 3 C 4 3
#> 4 D 2 10
#> 5 E 16 1
#> 6 F NA NA
#> 7 G NA NA
#> 8 H 4 3
#> 9 I NA NA
#> 10 J NA NA
#> 11 K 10 2

reprex package 于 2021 年 5 月 11 日创建(v0.3.0)

关于反转变量中非 NA 值的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67491881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com