簡體   English   中英

提取 function 中的數據框名稱以創建新列

[英]Extracting the data frame name inside a function to create a new column

我正在嘗試在 function 中創建一個包含數據框名稱的新列。

這是我的代碼:

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

一種選擇是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

帶有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

base R中,使用Map/transform

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

另一個lapply解決方案在這里。 由於您想獲取df_LIST的名稱,因此您應該使用names而不是deparse(substitute(x))

此處粘貼了前幾行df以進行演示。

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

使用cbindmapply另一種選擇:

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

list2env(df_FUN, .GlobalEnv)

Output

> 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

transform是從我添加lapply的@akrun 的解決方案復制而來的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM