R Tidyeval:将函数应用于从列表中提取的数据帧
这是一个包含复杂表的大型列表问题的简化版本。我想从列表中提取表,并对每个表应用一个函数。在这里,我们可以创建一个简单的列表,其中包含小的命名数据帧:R Tidyeval:将函数应用于从列表中提取的数据帧,r,tidyeval,R,Tidyeval,这是一个包含复杂表的大型列表问题的简化版本。我想从列表中提取表,并对每个表应用一个函数。在这里,我们可以创建一个简单的列表,其中包含小的命名数据帧: library(tidyverse) table_names <- c('dfA', 'dfB', 'dfC') dfA <- tibble(a = 1:3, b = 4:6, c = 7:9) dfB <- tibble(a = 10:12, b = 13:15, c = 16:18) dfC <- tibble(a
library(tidyverse)
table_names <- c('dfA', 'dfB', 'dfC')
dfA <- tibble(a = 1:3, b = 4:6, c = 7:9)
dfB <- tibble(a = 10:12, b = 13:15, c = 16:18)
dfC <- tibble(a = 19:21, b = 22:24, c = 25:27)
df_list <- list(dfA, dfB, dfC) %>% setNames(table_names)
然后使用map()
创建修改表的新列表:
new_list <- df_list %>% map(table_name, fun(x))
提前感谢您的帮助 我们可以使用
purrr::imap
传递列表中的数据以及列表的名称
library(dplyr)
library(purrr)
df_out <- imap(df_list, ~.x %>% mutate(name = .y) %>% select(name, everything()))
df_out
#$dfA
# A tibble: 3 x 4
# name a b c
# <chr> <int> <int> <int>
#1 dfA 1 4 7
#2 dfA 2 5 8
#3 dfA 3 6 9
#$dfB
# A tibble: 3 x 4
# name a b c
# <chr> <int> <int> <int>
#1 dfB 10 13 16
#....
#....
并给出与上面相同的列表名称。我们可以在传递
.id
library(purrr)
map_dfr(df_list, I, .id = 'name')
或使用bind_行
library(dplyr)
bind_rows(df_list, .id = 'name')
# A tibble: 9 x 4
# name a b c
# <chr> <int> <int> <int>
#1 dfA 1 4 7
#2 dfA 2 5 8
#3 dfA 3 6 9
#4 dfB 10 13 16
#5 dfB 11 14 17
#6 dfB 12 15 18
#7 dfC 19 22 25
#8 dfC 20 23 26
#9 dfC 21 24 27
库(dplyr)
绑定行(df\u列表,.id='name')
#一个tibble:9x4
#命名为abc
#
#1 dfA 14 7
#2 dfA 2 5 8
#3 dfA 3 6 9
#4 dfB 10 13 16
#5 dfB 11 14 17
#6 dfB 12 15 18
#7 dfC 19 22 25
#8 dfC 20 23 26
#9 dfC 21 24 27
在R表中是一个适用于类似矩阵的对象的术语;通常是列联表。另一方面,数据帧是一种特定类型的列表。这两种类型在提取函数语义上存在差异。你可能会认为“tibbles”与表非常相似,但事实并非如此。谢谢-我现在认识到我使用的“table”和“data frame”不精确。这是一个优雅的解决方案,在更复杂的应用程序中效果非常好。谢谢!谢谢-了解这些其他方法也很有帮助。语句map\u-dfr(df\u-list,I,.id='name')
中的I
参数的用途是什么?
library(dplyr)
library(purrr)
df_out <- imap(df_list, ~.x %>% mutate(name = .y) %>% select(name, everything()))
df_out
#$dfA
# A tibble: 3 x 4
# name a b c
# <chr> <int> <int> <int>
#1 dfA 1 4 7
#2 dfA 2 5 8
#3 dfA 3 6 9
#$dfB
# A tibble: 3 x 4
# name a b c
# <chr> <int> <int> <int>
#1 dfB 10 13 16
#....
#....
names(df_out) <- paste0(names(df_out), "_mod")
list2env(df_out, .GlobalEnv)
df_out <- Map(function(x, y) transform(x, name = y)[c('name', names(x))],
df_list, names(df_list))
library(purrr)
map_dfr(df_list, I, .id = 'name')
library(dplyr)
bind_rows(df_list, .id = 'name')
# A tibble: 9 x 4
# name a b c
# <chr> <int> <int> <int>
#1 dfA 1 4 7
#2 dfA 2 5 8
#3 dfA 3 6 9
#4 dfB 10 13 16
#5 dfB 11 14 17
#6 dfB 12 15 18
#7 dfC 19 22 25
#8 dfC 20 23 26
#9 dfC 21 24 27