Сортировка нескольких фреймов данных с функцией - PullRequest
0 голосов
/ 24 января 2019

У меня есть несколько фреймов данных (то есть D1, D2, D3).У каждого из них есть разные названия, которые я хочу отсортировать.Но я хочу создать функцию.

Например, D1 имеет следующие столбцы в этом порядке = клубника, яблоко, банан

D2 имеет следующие столбцы в этом порядке = x2, x4, x3 и т. Д. Вот что япытаясь настроить:

Column_Sort = function(data) {

data = data[,sort(columnnames(data)]

return data}

Есть ли способ, которым я могу 1) создать функцию сортировки 2) быть в состоянии отсортировать несколько наборов данных одновременно и вернуть ее

я знаю, ямогу сделать это один за другим, но у меня есть несколько наборов данных, которые я хотел бы сделать одновременно.

1 Ответ

0 голосов
/ 24 января 2019

Как вы заявляете, у вас есть 2 цели: 1) Сортировать 1 фрейм данных и 2) повторить операцию с несколькими фреймами данных. Это хорошее разделение, которое позволяет вам разработать решение сначала для 1), а затем для 2).

Ваша функция почти на месте. Чтобы получить имена столбцов, используйте colnames. Во-вторых, функции R не требуют оператора return, а просто возвращают последнее значение. Это также очень распространенное руководство по стилю (по крайней мере, в пакетах tidyverse). В общем, ваша функция становится:

sortdf <- function(data) {
  data[,sort(colnames(data))]
}

Для 2) вы можете либо объединить все свои фреймы данных в список, а затем использовать lapply:

lapply(list(D1, D2, D3), sortdf)

или вы можете создать вторую функцию, которая сделает это за вас. В любом случае, вы должны решить, как вы хотите, чтобы ваш вывод , так как и lapply, и функция могут возвращать только один объект - оба мы можем связать любое количество тингов в один list объект. Итак, давайте возьмем пометку и превратим ее в функцию:

sorter <- function(...) {
  lapply(list(...), sortdf)
}

Здесь мы используем эллипсы ... в качестве замены для любого числа аргументов, которые пользователь может захотеть бросить в функцию. В идеале это должно быть любое количество data.frame. Чтобы обработать набор переменных переменного размера, мы упаковываем его в список. Команда list(...) создаст список с точно такими же аргументами, как мы назвали sorter с помощью. Итак, давайте посмотрим на вывод из sorter.

Единственная проблема заключается в том, что возвращаемый список не имеет имени. Что вы указали в какой аргумент? Я представляю здесь расширенную версию, которая называет вывод. Изучите его и посмотрите, понимаете ли вы, что происходит.

sorter <- function(...) {
  m <- match.call()
  ret <- lapply(list(...), sortdf)
  if (is.null(names(ret))) {
    names(ret) <- make.names(m[-1])
  } else {
    names(ret)[names(ret) == ''] <- make.names(m[-1])[names(ret) == '']
  }
  ret
}

data("mtcars")
D1 <- mtcars[,c('cyl','drat','wt','am','qsec')]
sorter(D1, mtcars)
sorter(D1, b=data.frame(b='b',a='a'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...