【问题标题】:Create variable in various dataframes on a loop in R?在 R 的循环中的各种数据帧中创建变量?
【发布时间】:2019-05-08 09:50:58
【问题描述】:

我有 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)
}

【问题讨论】:

    标签: r loops for-loop


    【解决方案1】:

    最好在列表中使用它们。使用lspattern 将所有数据框收集在一起,然后使用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"]] 等访问单个数据帧。

    【讨论】:

      【解决方案2】:

      我们可以使用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")
      

      【讨论】:

        猜你喜欢
        • 2022-01-08
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多