2016-06-17 2 views
0

Предположим, у меня есть кадр данных:Как отсортировать данные по строке в R и разбить на несколько фреймов данных?

 Col1 Col2 Col3 Col4 Col5 Col6 

Row1 1  0  20  4  8 23 
Row2 0  1  3 61  2  1 
Row3 1  1  2  4  3 54 

Я хочу, чтобы отсортировать этот кадр данных на несколько кадров данных, так как я тоже хочу информацию о столбце.

 Col6 Col3 Col5 Col4 Col1 Col2 
Row1 23 20  8  4  1  0 

     Col4 Col3 Col5 Col2 Col6 Col1 
Row2 61  3  2  1  1  0 

     Col6 Col4 Col5 Col3 Col1 Col2 
Row3 54  4  3  2  1  1 
+3

Читать о применении и порядок , – zx8754

+1

Существует проблема с apply (df, 1, order), поскольку имена переменных не будут согласованы. Если требуется сохранить имена переменных порядка, это единственный способ разделить на отдельные data.frames, т. Е. Управлять через список. Один из способов сделать это можно: 'listdf = split (df, 1: nrow (df)', а затем использовать 'lapply' для изменения порядка каждого файла data.frame. –

+0

Рассматривая ваши вопросы, кажется, что вы никогда не принимали ответа на ваши вопросы. Пожалуйста, сделайте привычкой принимать ответ, который вы считаете наиболее полезным, щелкнув галочку рядом с ней. Это поможет другим посетителям, показывая им, что ответ помог. И это поможет автоответчику и самому себе давая обе точки репутации. Вы также можете посмотреть [тур], чтобы узнать, как работает StackOverflow. – Stibu

ответ

0

Как отмечается в комментарии по Eric Lecoutre, вы могли бы использовать lapply() в этой ситуации. Существуют разные способы сделать это, и я приведу вам два примера.

Сортировка выполняется в обоих примерах с помощью функции order(). Как это работает легче всего понять с примером:

x <- c(3, 4, 1, 2) 
x[order(x)] 
## [1] 1 2 3 4 
x[order(x, decreasing = TRUE)] 
## [1] 4 3 2 1 

Так, order() не возвращает упорядоченный вектор, а скорее индексы, которые могут быть использованы для заказа вектора.

Теперь к решениям вашей реальной проблемы. Вы могли бы применить более индексы строк следующим образом:

lapply(1:nrow(df), function(row) df[row, order(df[row, ], decreasing = TRUE)]) 

Или вы могли бы разделить кадр данных в списке кадра данных с одной строкой и применять в течение этого списка:

lapply(split(df, 1:nrow(df)), function(row) row[, order(row, decreasing = TRUE)]) 
+0

Thank вы для указания разбиения на список фреймов данных. В исходном исходном фрейме данных я ссылался на строки по некоторым именам. Однако, когда я пробовал ваш код, эти имена строк, похоже, потерялись в списке. code - 'q3 <-lapply (split (q, 1) : nrow (q)), function (row) row [, order (row, убывающее = TRUE)], function (x) {row.names (x) <- as.character (rownames (x) []); x}) ', однако я получаю эту ошибку:' Ошибка в FUN (X [[i]], ...): неиспользуемый аргумент (функция (x) { row.names (x) <- as.character (rownames (x) []) x }) ' –

+0

Я получаю кадры данных с именами как строк, так и столбцов, поэтому кажется, что я не могу воспроизвести вашу проблему. Сообщение об ошибке связано с тем, что вы не можете передать две функции для 'lapply(). Посмотрите на '' lapply', чтобы лучше понять, как это работает. – Stibu

Смежные вопросы