Имя столбцы с именем Dataframe в списке Dataframes - PullRequest
0 голосов
/ 06 июня 2018

Цель: изменить имя столбца данных в списке кадров данных на имя каждого кадра данных.

У меня есть некоторые проблемы при работе со списком и кадрами данных относительно его имени.Я подготовил этот пример для пояснения.Надеюсь, что это не беспорядок.

Данные:

df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(A = 3, B = 3, C = 2)
dfList <- list(df1,df2)

Выход:

> str(dfList)
List of 2
 $ :'data.frame':   1 obs. of  3 variables:
  ..$ A: num 1
  ..$ B: num 2
  ..$ C: num 3
 $ :'data.frame':   1 obs. of  3 variables:
  ..$ A: num 3
  ..$ B: num 3
  ..$ C: num 2
> names(dfList)
NULL
> names(dfList$df1)
NULL
> names(dfList$df2)
NULL

Вводимые вручную имена:

names(dfList) <- c("df1", "df2") 
dfList <- lapply(dfList, setNames, c("A", "B", "C")) 

Что дает:

> str(dfList)
List of 2
 $ df1:'data.frame':    1 obs. of  3 variables:
  ..$ A: num 1
  ..$ B: num 2
  ..$ C: num 3
 $ df2:'data.frame':    1 obs. of  3 variables:
  ..$ A: num 3
  ..$ B: num 3
  ..$ C: num 2
> names(dfList)
[1] "df1" "df2"
> names(dfList$df1)
[1] "A" "B" "C"
> names(dfList$df2)
[1] "A" "B" "C"

Желаемое решение:

WishedList <- dfList
WishedList[[1]] <- setNames(WishedList[[1]], c("A", "B", "df1"))
WishedList[[2]] <- setNames(WishedList[[2]], c("A", "B", "df2"))

Выходное решение:

> str(WishedList)
List of 2
 $ df1:'data.frame':    1 obs. of  3 variables:
  ..$ A  : num 1
  ..$ B  : num 2
  ..$ df1: num 3
 $ df2:'data.frame':    1 obs. of  3 variables:
  ..$ A  : num 3
  ..$ B  : num 3
  ..$ df2: num 2
> names(WishedList)
[1] "df1" "df2"
> names(WishedList$df1)
[1] "A"   "B"   "df1"
> names(WishedList$df2)
[1] "A"   "B"   "df2"

MyTry:

TryList1 <- lapply(dfList, function(x) setNames(x, c("A", "B", quote(x))))
str(TryList1)
List of 2
 $ df1:'data.frame':    1 obs. of  3 variables:
  ..$ A: num 1
  ..$ B: num 2
  ..$ x: num 3
 $ df2:'data.frame':    1 obs. of  3 variables:
  ..$ A: num 3
  ..$ B: num 3
  ..$ x: num 2

Сомнения:

1) Почему при создании файла не учитываются имена как кадров данных, так и столбцов столбцов данныхв списке?

2) цитата (х) с одним кадром данных работает.Почему нет в списке?

> df1 <- data.frame(A = 1, B = 2, C = 3)
> df1 <- setNames(df1, c("A", "B", quote(df1)))
> names(df1)
[1] "A"   "B"   "df1"

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Мы можем lapply() более names(dfList) вместо dfList:

lapply(names(dfList), function(dfn) {
  df <- dfList[[dfn]]
  names(df)[3] <- dfn
  df
})

# [[1]]
#   A B df1
# 1 1 2   3
# 
# [[2]]
#   A B df2
# 1 3 3   2

В purrr есть удобная функция, которая отображает список и его имена одновременно:

library(purrr)

imap(dfList, ~ {
  names(.x)[3] <- .y
  .x
})

# $df1
#   A B df1
# 1 1 2   3
# 
# $df2
#   A B df2
# 1 3 3   2

Или, если вы хотите короткого однострочного текста и не возражаете против жесткого кодирования "A" и "B":

imap(dfList, ~ setNames(.x, c("A", "B", .y)))

(Примечание: по сути это простоВариации вокруг ответа Docendo discimus).


Кроме того, не ожидаемый результат, но может быть интересным для вас:

dplyr::bind_rows(dfList, .id = "origin")

#   origin A B C
# 1    df1 1 2 3
# 2    df2 3 3 2

Или:

bind_rows(map(dfList, select, -C), .id = "C")

#     C A B
# 1 df1 1 2
# 2 df2 3 3
0 голосов
/ 06 июня 2018

Вот немного другой подход:

df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(A = 3, B = 3, C = 2)
dfList <- list(df1,df2)
names(dfList) <- c("df1", "df2") 

Map(function(df, dfn) {names(df)[3] <- dfn; df}, dfList, names(dfList))

#$df1
#  A B df1
#1 1 2   3
#
#$df2
#  A B df2
#1 3 3   2

В качестве альтернативы вы можете использовать setNames(df, c("A", "B", dfn)) внутри функции mapply.

Примечание по испытанию OP: документация для quoteсостояния:

цитата просто возвращает свой аргумент.

Поэтому, когда вы используете quote(x) внутри lapply, он просто возвращает символ x.

...