Как преобразовать большой фрейм данных на основе столбцов в список фреймов данных в R - PullRequest
1 голос
/ 04 февраля 2020

У меня есть большой фрейм данных с 1365 столбцами, как показано в примере:

df <- data.frame(X1 = c(7.48, 7.59), Y1 = c(49.16, 48.70), ID1 = c("B_1", "B_1_2"), TI1 = c(191.31, 1349.93), 
              X2 = c(8.15, 8.06), Y2 = c(48.40, 48.18), ID2 = c("B_1", "B_1_2"), TI2 = c(191.39, 1349.97),
              X3 = c(8.80, 8.87), Y3 = c(47.65, 47.20), ID3 = c("B_1", "B_1_2"), TI3 = c(191.48, 1350.05))

Теперь я хотел бы разбить этот фрейм данных на список фреймов данных (т.е. три фрейма данных в этом списке; 12/4 = 3) ожидаемый список, который выглядит следующим образом:

dflist[[1]]

X1    Y1     ID1     TI1   
7.48  49.16  B_1    191.31
7.59  48.70  B_1_2  1349.93

dflist[[2]]

X2     Y2    ID2     TI2 
8.15   48.40   B_1    191.39
8.06   48.18   B_1_2  1349.97

dflist[[3]]

X3     Y3    ID3     TI3
8.80   47.65   B_1    191.48 
8.87   47.20   B_1_2  1350.05

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

сначала, чтобы преобразовать фрейм данных в список, я использовал следующий код, но не работал

n <- seq(1,12, by = 4)

my_data <- list()
for (i in 3) {
  for (j in seq(1, 12, by = 4)) {

    my_data[[i]] <- df3[, j:j+3]

  }
}

, для сортировки списка используется следующий код:

dflist1 <- lapply(dflist, function(1){
            1[with(dflist, order[, 4]), ]
           })

ищет код для получения ожидаемый результат (dflist), как указано выше

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Мы можем использовать split.default для разделения данных на список, использовать lapply до l oop для каждого элемента и order их на основе 4-го столбца.

dflist <- lapply(split.default(df, gl(ncol(df)/4, 4)),function(x) x[order(x[[4]]),])
dflist
#$`1`
#    X1   Y1   ID1  TI1
#1 7.48 49.2   B_1  191
#2 7.59 48.7 B_1_2 1350

#$`2`
#    X2   Y2   ID2  TI2
#1 8.15 48.4   B_1  191
#2 8.06 48.2 B_1_2 1350

#$`3`
#    X3   Y3   ID3  TI3
#1 8.80 47.6   B_1  191
#2 8.87 47.2 B_1_2 1350
0 голосов
/ 04 февраля 2020

Решение Tidyverse: используйте map, select и arrange_at.

library(tidyverse)

map(as.character(1:3), ~select(df, ends_with(.x)) %>% arrange_at(4))

Объяснение:

  • map выполняет итерации по элементам в первом аргумент - здесь строковые представления 1, 2, 3.
  • Эти элементы применяются к вызову функции во втором аргументе, который является select, методом выбора столбца из dplyr.
  • На каждой итерации map выбираются столбцы, которые end_with 1, затем 2, затем 3.
  • После создания этого подмножества столбцов мы arrange_at 4-й столбец.
  • map возвращает список выходных данных из функции, которые здесь представляют собой фреймы данных - и который возвращает вам список отсортированных, поднабора, фреймов данных.
...