Создать переменную в различных фреймах данных в цикле в R? - PullRequest
0 голосов
/ 08 мая 2019

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


i.e.:

dataframe_a

var 1 | var 2 | var 3 | variable
  x   |   x   |   x   | dataframe_a
  x   |   x   |   x   | dataframe_a
  x   |   x   |   x   | dataframe_a


dataframe_b

var 1 | var 2 | var 3 | variable
  x   |   x   |   x   | dataframe_b
  x   |   x   |   x   | dataframe_b
  x   |   x   |   x   | dataframe_b


dataframe_c

var 1 | var 2 | var 3 | variable
  x   |   x   |   x   | dataframe_c
  x   |   x   |   x   | dataframe_c
  x   |   x   |   x   | dataframe_c


Существует два способа (ниже), которые я могуделать то, что я хочу для каждого кадра данных в отдельности.Однако как я могу превратить следующий код в цикл for, чтобы мне не приходилось писать его 100 раз?

(я использую dplyr :: mutate)


#Take a, b and c as separate dataframes 

dataframe_a$variable <- paste("dataframe_a")
dataframe_b$variable <- paste("dataframe_b")
dataframe_c$variable <- paste("dataframe_c")

#or

dataframe_a %<>% mutate(variable = paste("dataframe_a"))
dataframe_b %<>% mutate(variable = paste("dataframe_b"))
dataframe_c %<>% mutate(variable = paste("dataframe_c"))

Я пробовал следующее, но это не работает

vector <- c("a", "b", "c") 

for (i in vector){

  df <- get(i)

  assign(i, mutate(location = paste(i)), envir = .GlobalEnv)
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Мы можем использовать imap

library(tidyverse)
imap(mget(names_df), ~ .x %>%
            mutate(variable = .y))
#$dataframe_a
#  a  b    variable
#1 1  6 dataframe_a
#2 2  7 dataframe_a
#3 3  8 dataframe_a
#4 4  9 dataframe_a
#5 5 10 dataframe_a

#$dataframe_b
#  a  b    variable
#1 1  6 dataframe_b
#2 2  7 dataframe_b
#3 3  8 dataframe_b
#4 4  9 dataframe_b
#5 5 10 dataframe_b

#$dataframe_c
#  a  b    variable
#1 1  6 dataframe_c
#2 2  7 dataframe_c
#3 3  8 dataframe_c
#4 4  9 dataframe_c
#5 5 10 dataframe_c

данные

dataframe_a <- data.frame(a = 1:5, b = 6:10)
dataframe_b <- data.frame(a = 1:5, b = 6:10)
dataframe_c <- data.frame(a = 1:5, b = 6:10)

names_df <- ls(pattern = "dataframe")
0 голосов
/ 08 мая 2019

Лучше использовать их в списках. Соберите все данные вместе, используя ls с pattern, которые есть у вашего файла данных, а затем используйте mget, чтобы получить фактический кадр данных, а затем cbind.

names_df <- ls(pattern = "dataframe")
Map(cbind, mget(names_df), variable = names_df)

Использование воспроизводимых данных

dataframe_a <- data.frame(a = 1:5, b = 6:10)
dataframe_b <- data.frame(a = 1:5, b = 6:10)
dataframe_c <- data.frame(a = 1:5, b = 6:10)

names_df <- ls(pattern = "dataframe")
df1 <- Map(cbind, mget(names_df), variable = names_df)
df1

#$dataframe_a
#  a  b    variable
#1 1  6 dataframe_a
#2 2  7 dataframe_a
#3 3  8 dataframe_a
#4 4  9 dataframe_a
#5 5 10 dataframe_a

#$dataframe_b
#  a  b    variable
#1 1  6 dataframe_b
#2 2  7 dataframe_b
#3 3  8 dataframe_b
#4 4  9 dataframe_b
#5 5 10 dataframe_b

#$dataframe_c
#  a  b    variable
#1 1  6 dataframe_c
#2 2  7 dataframe_c
#3 3  8 dataframe_c
#4 4  9 dataframe_c
#5 5 10 dataframe_c

Теперь вы можете получить доступ к индивидуальному фрейму данных с помощью df1[["dataframe_a"]], df1[["dataframe_b"]] и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...