Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Tidyeval:将函数应用于从列表中提取的数据帧_R_Tidyeval - Fatal编程技术网

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