按 R 中的降序在列之间交换值

  • 本文关键字:之间 交换 降序 r
  • 更新时间 :
  • 英文 :


我有一个数据帧:

Name  Out1 Out2 Out3
Dave  2    3    3
Pete  3    3    4
John  2    NA   NA

我需要按降序对 3 个"Out"列进行排序 所以我最终会得到:

Name  Out1 Out2 Out3
Dave  3    3    2
Pete  4    3    3
John  2    NA   NA

我有 NA 很好,只要该行中有一个值,它就会被推到"Out1">

任何帮助表示赞赏

我们可以使用apply,并按降序按行方式sort值。默认情况下,sort删除NA值,因此我们添加na.last = TRUE以将NAs保持在最后。

df[-1] <- t(apply(df[-1], 1, sort, decreasing = TRUE, na.last = TRUE))
df
#  Name Out1 Out2 Out3
#1 Dave    3    3    2
#2 Pete    4    3    3
#3 John    2   NA   NA

数据

df <- structure(list(Name = structure(c(1L, 3L, 2L), .Label = c("Dave", 
"John", "Pete"), class = "factor"), Out1 = c(2L, 3L, 2L), Out2 = c(3L, 
3L, NA), Out3 = c(3L, 4L, NA)), class = "data.frame", row.names = c(NA, 3L))

我们可以在tidyverse中做到这一点pivot_longer/pivot_wider

library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -Name) %>% 
group_by(Name) %>% 
mutate(value = value[order(-value)]) %>%
pivot_wider(names_from = name, values_from = value)
# A tibble: 3 x 4
# Groups:   Name [3]
#  Name   Out1  Out2  Out3
#  <fct> <int> <int> <int>
#1 Dave      3     3     2
#2 Pete      4     3     3
#3 John      2    NA    NA

或者另一种选择是pmap

library(purrr)
df %>%
select(-Name) %>%
pmap(~ c(...) %>% 
sort.int(decreasing = TRUE, na.last = TRUE) %>% 
set_names(names(df)[-1]) %>% 
as.list) %>% 
tibble(Name = df$Name, Out = .) %>% 
unnest_wider(Out)
# A tibble: 3 x 4
#  Name   Out1  Out2  Out3
#  <fct> <int> <int> <int>
#1 Dave      3     3     2
#2 Pete      4     3     3
#3 John      2    NA    NA

数据

df <- structure(list(Name = structure(c(1L, 3L, 2L), .Label = c("Dave", 
"John", "Pete"), class = "factor"), Out1 = c(2L, 3L, 2L), Out2 = c(3L, 
3L, NA), Out3 = c(3L, 4L, NA)), class = "data.frame", row.names = c(NA, 
3L))

最新更新