【问题标题】:Extracting the data frame name inside a function to create a new column提取函数内的数据框名称以创建新列
【发布时间】:2022-06-16 10:52:54
【问题描述】:

我正在尝试在函数中使用数据框的名称创建一个新列。

这是我的代码:

df1 <- data.frame(var1 = seq(1:10))
df2 <- data.frame(var2 = seq(1:10))
df3 <- data.frame(var3 = seq(1:10))

df_LIST <- tibble::lst(df1, df2, df3)
df_FUN <- lapply(
  df_LIST, 
  function(x)
  {
    mutate(x, 
           df_NAME = deparse(substitute(x))
    ) %>%
      select("df_NAME") %>%
      na.omit()
  }  
)

list2env(df_FUN, .GlobalEnv)

结果:

> df1
   df_NAME
1        x
2        x
3        x
4        x
5        x
6        x
7        x
8        x
9        x
10       x

预期结果:

> df1
   df_NAME
1      df1
2      df1
3      df1
4      df1
5      df1
6      df1
7      df1
8      df1
9      df1
10     df1

【问题讨论】:

    标签: r list dataframe dplyr


    【解决方案1】:

    一个选项是purrr::imap:

    library(dplyr)
    
    df_LIST <- tibble::lst(df1, df2, df3)
    df_FUN <- purrr::imap(
      df_LIST,
      function(x, y) {
        mutate(x,
          df_NAME = y
        ) %>%
          select("df_NAME") %>%
          na.omit()
      }
    )
    
    df_FUN$df1
    #>    df_NAME
    #> 1      df1
    #> 2      df1
    #> 3      df1
    #> 4      df1
    #> 5      df1
    #> 6      df1
    #> 7      df1
    #> 8      df1
    #> 9      df1
    #> 10     df1
    

    【讨论】:

      【解决方案2】:

      base R 中,使用Map/transform

      Map(transform, df_LIST, df_NAME = names(df_LIST))
      

      【讨论】:

        【解决方案3】:

        purrr::imap 的单线:

        library(tidyverse)
        df_FUN <- imap(df_LIST, ~ transmute(.x, df_NAME = .y))
        
        > df_FUN$df1
        
           var1 df_NAME
        1     1     df1
        2     2     df1
        3     3     df1
        4     4     df1
        5     5     df1
        6     6     df1
        7     7     df1
        8     8     df1
        9     9     df1
        10   10     df1
        

        【讨论】:

          【解决方案4】:

          使用cbindmapply 的另一个选项:

          df_FUN <- mapply(cbind, df_LIST, "df_NAME"=names(df_LIST), SIMPLIFY=F)
          
          list2env(df_FUN, .GlobalEnv)
          

          输出

          > df_FUN$df1
          
             var1 df_NAME
          1     1     df1
          2     2     df1
          3     3     df1
          4     4     df1
          5     5     df1
          6     6     df1
          7     7     df1
          8     8     df1
          9     9     df1
          10   10     df1
          

          【讨论】:

            【解决方案5】:

            transform 复制自@akrun 的解决方案我添加了lapply

            Map(transform,lapply(df_LIST, function(x) {
              names(x)[ grep("var", names(x))] <- "df_NAME"
              x} ), df_NAME = names(df_LIST))
            
            $df1
               df_NAME
            1      df1
            2      df1
            3      df1
            4      df1
            5      df1
            6      df1
            7      df1
            8      df1
            9      df1
            10     df1
            
            $df2
               df_NAME
            1      df2
            2      df2
            3      df2
            4      df2
            5      df2
            6      df2
            7      df2
            8      df2
            9      df2
            10     df2
            
            $df3
               df_NAME
            1      df3
            2      df3
            3      df3
            4      df3
            5      df3
            6      df3
            7      df3
            8      df3
            9      df3
            10     df3
            

            【讨论】:

              【解决方案6】:

              这里是另一个lapply 解决方案。由于您想获取df_LIST 的名称,因此您应该使用names 而不是deparse(substitute(x))

              dfs 的前几行粘贴在这里进行演示。

              library(dplyr)
              
              setNames(
                lapply(1:length(df_LIST), function(x) 
                  transmute(df_LIST[[x]], df_NAME = names(df_LIST[x])) %>% 
                    na.omit()), 
                names(df_LIST)
                ) %>% 
                list2env(.GlobalEnv)
              
              df1
                 df_NAME
              1      df1
              2      df1
              3      df1
              
              df2
                 df_NAME
              1      df2
              2      df2
              3      df2
              
              df3
                 df_NAME
              1      df3
              2      df3
              3      df3
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-10-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-12-03
                • 1970-01-01
                • 2020-10-25
                相关资源
                最近更新 更多