我有一个数据帧:
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
以将NA
s保持在最后。
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))