Поменять значения между столбцами в порядке убывания в R - PullRequest
0 голосов
/ 08 октября 2019

У меня есть фрейм данных:

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'

Любая помощь приветствуется

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Мы можем использовать apply и sort значения построчно в порядке убывания. По умолчанию sort удаляет NA значения, поэтому мы добавляем na.last = TRUE, чтобы сохранить NA с последними.

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))
0 голосов
/ 08 октября 2019

Мы можем сделать это в 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

data

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...