![](/img/trans.png)
[英]Extracting parts of a row name to make a new column in a data frame in R
[英]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
使用cbind
和mapply
另一種選擇:
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.