Вставить имя элемента в столбцы в каждом элементе списка - PullRequest
1 голос
/ 25 апреля 2019

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

Я хотел бы paste имя каждого кадра данных для столбцов, чтобы, когда я cbind объединял их в один большой кадр данных, я мог различать их.

Пример данных;

LIST <- list(df1 = data.frame("ColA" = c(1:5), "ColB" = c(10:14)), 
             df2 = data.frame("ColA" = c(21:25), "ColB" = c(30:34)))

str(LIST)

List of 2
 $ df1:'data.frame':    5 obs. of  2 variables:
  ..$ ColA: int [1:5] 1 2 3 4 5
  ..$ ColB: int [1:5] 10 11 12 13 14
 $ df2:'data.frame':    5 obs. of  2 variables:
  ..$ ColA: int [1:5] 21 22 23 24 25
  ..$ ColB: int [1:5] 30 31 32 33 34

Желаемый выход;

List of 2
     $ df1:'data.frame':    5 obs. of  2 variables:
      ..$ df1.ColA: int [1:5] 1 2 3 4 5
      ..$ df1.ColB: int [1:5] 10 11 12 13 14
     $ df2:'data.frame':    5 obs. of  2 variables:
      ..$ df2.ColA: int [1:5] 21 22 23 24 25
      ..$ df2.ColB: int [1:5] 30 31 32 33 34

Ответы [ 3 ]

3 голосов
/ 25 апреля 2019

Поскольку вы упоминаете, что хотите использовать cbind позже, вы можете использовать as.data.frame сразу

as.data.frame(LIST)
#  df1.ColA df1.ColB df2.ColA df2.ColB
#1        1       10       21       30
#2        2       11       22       31
#3        3       12       23       32
#4        4       13       24       33
#5        5       14       25       34

Благодаря @RonakShah вы можете использовать следующие строки, чтобы получить список в случае необходимости

df1 <- as.data.frame(LIST)
split.default(df1, sub("\\..*", "", names(df1)))
2 голосов
/ 25 апреля 2019

Вы можете сделать это в lapply с глобальным присваиванием <<-.

lapply(seq_along(LIST), function(x) 
  names(LIST[[x]]) <<- paste0(names(LIST)[x], ".", names(LIST[[x]])))

Или с использованием Map в качестве @ Sotos Рекомендуется

LIST <- Map(function(x, y) {names(x) <- paste0(y, '.', names(x)); x}, LIST, names(LIST))

Урожайность

str(LIST)
# List of 2
# $ df1:'data.frame':   5 obs. of  2 variables:
#   ..$ df1.ColA: int [1:5] 1 2 3 4 5
# ..$ df1.ColB: int [1:5] 10 11 12 13 14
# $ df2:'data.frame':   5 obs. of  2 variables:
#   ..$ df2.ColA: int [1:5] 21 22 23 24 25
# ..$ df2.ColB: int [1:5] 30 31 32 33 34
1 голос
/ 25 апреля 2019

Привет, вы можете использовать map2, чтобы сделать это:

library(tidyverse)
map2(mylist, names(mylist), ~rename_all(.x, function(z) paste(.y, z, sep = ".")))

РЕДАКТИРОВАТЬ: или как предложено в начале использования imap

imap(mylist, ~rename_all(.x, function(z) paste(.y, z, sep = ".")))
...