R построчная сортировка по заданным c столбцам - PullRequest
0 голосов
/ 24 февраля 2020

Я хотел бы сделать построчную сортировку с использованием указанных c столбцов, но также сохранить все столбцы из исходного df.

Данные:

df <- structure(list(C1 = c("ABC", "XYZ", "DEF"),
                           C2 = c("ZLO", "BCD", "PQR"),
                           C3 = c("E1", "E2", "E3")),
                           class = "data.frame", row.names = c(NA, -3L))

Desired output:
C1  C2  C3
ABC ZLO E1
BCD XYZ E2
DEF PQR E3

Я пытался сделать это используя:

df <- t(apply(df[1:2], 1, 
                   FUN=function(x) sort(x, decreasing=FALSE)))

, но возвращает только первые два столбца, и мне нужна помощь: а) векторизовать его б) сохранить все столбцы

Ответы [ 3 ]

1 голос
/ 24 февраля 2020
df <- structure(list(C1 = c("ABC", "XYZ", "DEF"),
                     C2 = c("ZLO", "BCD", "PQR"),
                     C3 = c("E1", "E2", "E3")),
                class = "data.frame", row.names = c(NA, -3L))

Решение использует символы dplyr и tidyr, чтобы привести данные в длинную форму, сгруппировать их по строкам и отсортировать по строкам, а затем вернуть обратно в широкую форму:

library(dplyr)
library(tidyr)

Изменить:

Отредактированный код, так что C3 остается без изменений

df %>% 
  mutate(ID = row_number()) %>% 
  pivot_longer(cols=-c(ID, C3)) %>% 
  group_by(ID) %>% 
  arrange(value) %>% 
  mutate(name = paste0("C", row_number())) %>% 
  pivot_wider(names_from = name,
              values_from = value) %>% 
  select(C1, C2, C3)


# Groups:   ID [3]
     ID C1    C2    C3   
  <int> <chr> <chr> <chr>
1     1 ABC   ZLO   E1   
2     2 BCD   XYZ   E2   
3     3 DEF   PQR   E3 
1 голос
/ 24 февраля 2020

Вместо присвоения df, присваивайте только столбцы, которые вы хотите отсортировать.

df[1:2] <- t(apply(df[1:2], 1, 
              FUN=function(x) sort(x, decreasing=FALSE)))

Или записать проще:

to_sort <- 1:2
df[to_sort] <- t(apply(df[to_sort], 1, sort, decreasing = FALSE))
0 голосов
/ 24 февраля 2020

Вот еще одно решение:

  librar(dplyr)
  df <- apply(df[1:2], 1, sort) %>% 
    t() %>% 
    cbind(df[3]) %>% 
    as.data.frame() %>% 
    setNames(paste0("C", 1:length(.)))

# output
     C1  C2 C3
  1 ABC ZLO E1
  2 BCD XYZ E2
  3 DEF PQR E3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...