Переупорядочение списков и кадров данных в R - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть список с большим количеством data.frames (d = 100), каждый из которых содержит несколько переменных (v = 10).Я хотел бы переставить данные так, чтобы вместо этого у меня был новый список из 10 data.frames с 100 столбцами каждый, извлекая соответствующий столбец из каждого из 100 исходных data.frames.Таким образом, новый data.frame1 будет иметь 100 столбцов, каждый из которых будет первым столбцом из исходных data.frames, новый data.frame2 будет иметь 100 столбцов, каждый из которых будет вторым столбцом из исходных data.frames, ...., n.Какой лучший способ изменить это.Заранее спасибо.

1 Ответ

0 голосов
/ 09 декабря 2018

Вот способ, использующий фиктивные данные, поскольку вы не предоставили ввод.

df1 <- df2 <- df3 <- df4 <- df5 <- data.frame(v1 = 1:3, v2 = 4:6)
lst <- mget(ls(pattern = "^df"))

Я предполагаю, что ваш список выглядит примерно как lst выше.Здесь у нас есть 5 фреймов данных с 2 столбцами в каждом, и мы перегруппируем его так, чтобы мы получили список из 2 фреймов данных, содержащий 5 столбцов в каждом.

split_idx <- seq_len(unique(lengths(lst))) # in your case, this should give you 1:10
out <- split.default(x = Reduce(cbind, lst), split_idx)
#$`1`
#  v1 v1.1 v1.2 v1.3 v1.4
#1  1    1    1    1    1
#2  2    2    2    2    2
#3  3    3    3    3    3

#$`2`
#  v2 v2.1 v2.2 v2.3 v2.4
#1  4    4    4    4    4
#2  5    5    5    5    5
#3  6    6    6    6    6

split.default разбивает список по столбцам.


Если нам нужно изменить имена каждого фрейма данных, мы могли бы сделать

out <- lapply(out, function(x) {
  names(x) <- paste0(gsub("(v[0-9]+)\\.+", "\\1", names(x)), "_", 1:5)
  x
  })

out
#$`1`
#  v1_1 v1_2 v1_3 v1_4 v1_5
#1    1    1    1    1    1
#2    2    2    2    2    2
#3    3    3    3    3    3

#$`2`
#  v2_1 v2_2 v2_3 v2_4 v2_5
#1    4    4    4    4    4
#2    5    5    5    5    5
#3    6    6    6    6    6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...