R 反转变量中非NA值的顺序
我感兴趣的是以整洁的方式反转具有NA值的列的值 在这里,rev调用不会起作用:R 反转变量中非NA值的顺序,r,dplyr,data-wrangling,R,Dplyr,Data Wrangling,我感兴趣的是以整洁的方式反转具有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)) 因为它完全反转了值(包括NAs) 我基本上需要一个整洁的mutate命令(无拆分/合并),该命令反转哪个列的值,使E的值为1(max变为min),B的值为16(mi
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))
因为它完全反转了值(包括NAs)
我基本上需要一个整洁的mutate命令(无拆分/合并),该命令反转哪个列的值,使E的值为1(max变为min),B的值为16(min变为max),等等,而NA的值保持NA(F,G,I&J)
编辑:
有几个答案没有达到预期的结果。该问题旨在有效地进行反向(rev)工作,同时保持NAs就位
@Moody_Mudskipper有一个解决方案,可以解决没有重复的情况,但在有重复时失败,例如:
rev_na <- function(x) setNames(sort(x), sort(x, TRUE))[as.character(x)]
此处失败:
这就行了
data.frame(
Which = LETTERS[1:11],
x = c( c(3,1,4,2,16), NA, NA, 4, rep(NA, 2), 10)) -> df
df %>% group_by(d = is.na(x)) %>%
arrange(x) %>%
mutate(y = ifelse(!d, rev(x), x)) %>%
ungroup %>% select(-d)
# A tibble: 11 x 3
Which x y
<chr> <dbl> <dbl>
1 B 1 16
2 D 2 10
3 A 3 4
4 C 4 4
5 H 4 3
6 K 10 2
7 E 16 1
8 F NA NA
9 G NA NA
10 I NA NA
11 J NA NA
如果你能容忍一点黑客行为:
tibble(
其中=字母[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)])
#>#tibble:11 x 3
#>哪个x y
#>
#>1 A 3 4
#>2 B 1 16
#>3 C 4 3
#>4D210
#>5 E 16 1
#>6 F NA
#>7克钠钠
#>8小时43
#>9我拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿
#>10 J NA NA
#>11K102
由(v0.3.0)于2021年5月11日创建。太好了,一个优雅的代码。投票通过。确实是一个有趣的解决方案。。希望少一点魔法-没有黑客似乎是一个非常简单的问题。@Moody_Mudskipper您的解决方案在没有重复的情况下效果很好,但在有重复的情况下,它不能用作NA友好的反面。想法?可能使用
unique()
:setNames(sort(unique(x)),sort(unique(x),TRUE))
tibble(
Which = LETTERS[1:7],
x = c(3,1,9,9,9, 9, 10)
) %>% mutate(y = rev_na(x), z = rev(x))
data.frame(
Which = LETTERS[1:11],
x = c( c(3,1,4,2,16), NA, NA, 4, rep(NA, 2), 10)) -> df
df %>% group_by(d = is.na(x)) %>%
arrange(x) %>%
mutate(y = ifelse(!d, rev(x), x)) %>%
ungroup %>% select(-d)
# A tibble: 11 x 3
Which x y
<chr> <dbl> <dbl>
1 B 1 16
2 D 2 10
3 A 3 4
4 C 4 4
5 H 4 3
6 K 10 2
7 E 16 1
8 F NA NA
9 G NA NA
10 I NA NA
11 J NA NA
df %>%
group_by(d = is.na(x)) %>%
arrange(x) %>%
mutate(y = ifelse(!d, rev(x), x)) %>%
ungroup %>% select(-d) %>%
arrange(Which)
# A tibble: 11 x 3
Which x y
<chr> <dbl> <dbl>
1 A 3 4
2 B 1 16
3 C 4 4
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