为什么在数据框列表上使用管道和地图会失败?
Why does using pipes and map fail on a list of data frames?
我也将 tibbles 嵌套在一个带有标识符列的列表中。我想在每个嵌套的 tibble 上使用 运行 个匿名函数。但是,当我使用管道引用我的主 df 然后引用包含我的数据映射的列表时,它不起作用。
# Creating the df
df_nested <- iris %>% group_by(Species) %>% nest()
# Does not work
# df_nested %>%
# map(data, nrow)
# Works
map(df_nested$data, nrow)
我想了解为什么代码不能使用管道。
那是因为当使用管道 (%>%
) 时,第一个参数默认从 LHS 传递。
当你在做的时候
df_nested %>% map(data, nrow)
你得到
#$Species
#[1] ".x[[i]]" "nrow"
#$data
#[1] ".x[[i]]" "nrow"
#Warning messages:
#1: In .f(.x[[i]], ...) : data set ‘.x[[i]]’ not found
#2: In .f(.x[[i]], ...) : data set ‘nrow’ not found
#3: In .f(.x[[i]], ...) : data set ‘.x[[i]]’ not found
#4: In .f(.x[[i]], ...) : data set ‘nrow’ not found
与
相同
map(df_nested, data, nrow)
如果您想使用管道,您可能需要
df_nested$data %>% map(nrow)
#[[1]]
#[1] 50
#[[2]]
#[1] 50
#[[3]]
#[1] 50
使用nested
数据时,总是使用mutate
更好:
df_nested %>%
mutate(Nrow=map(data,nrow)) %>%
unnest(Nrow)
# A tibble: 3 x 3
Species data Nrow
<fct> <list> <int>
1 setosa <tibble [50 x 4]> 50
2 versicolor <tibble [50 x 4]> 50
3 virginica <tibble [50 x 4]> 50
我也将 tibbles 嵌套在一个带有标识符列的列表中。我想在每个嵌套的 tibble 上使用 运行 个匿名函数。但是,当我使用管道引用我的主 df 然后引用包含我的数据映射的列表时,它不起作用。
# Creating the df
df_nested <- iris %>% group_by(Species) %>% nest()
# Does not work
# df_nested %>%
# map(data, nrow)
# Works
map(df_nested$data, nrow)
我想了解为什么代码不能使用管道。
那是因为当使用管道 (%>%
) 时,第一个参数默认从 LHS 传递。
当你在做的时候
df_nested %>% map(data, nrow)
你得到
#$Species
#[1] ".x[[i]]" "nrow"
#$data
#[1] ".x[[i]]" "nrow"
#Warning messages:
#1: In .f(.x[[i]], ...) : data set ‘.x[[i]]’ not found
#2: In .f(.x[[i]], ...) : data set ‘nrow’ not found
#3: In .f(.x[[i]], ...) : data set ‘.x[[i]]’ not found
#4: In .f(.x[[i]], ...) : data set ‘nrow’ not found
与
相同map(df_nested, data, nrow)
如果您想使用管道,您可能需要
df_nested$data %>% map(nrow)
#[[1]]
#[1] 50
#[[2]]
#[1] 50
#[[3]]
#[1] 50
使用nested
数据时,总是使用mutate
更好:
df_nested %>%
mutate(Nrow=map(data,nrow)) %>%
unnest(Nrow)
# A tibble: 3 x 3
Species data Nrow
<fct> <list> <int>
1 setosa <tibble [50 x 4]> 50
2 versicolor <tibble [50 x 4]> 50
3 virginica <tibble [50 x 4]> 50