如何在函数中使用嵌套tibble变量?求解代码最后一行运行问题
解决嵌套tibble数据调用问题
原代码的核心问题是:嵌套后的y是列表列,每个元素是包含n列的小tibble,直接写y$n无法正确提取每行对应的n数据——它会尝试从整个列表列里找n,而不是逐行访问每个小tibble中的n。
以下是两种可行的修改方式:
方式一:调整函数 + 使用map2逐行处理
把函数改成接收嵌套的tibble,然后用purrr::map2来同时遍历y(嵌套列)和x(数值列):
require(tidyverse) # 生成数据部分不变 df <- data.frame(Unit = sample(1:20, replace = T, size = 100)) df$n = rpois(n = nrow(df),lambda = 200) df <- df %>% nest(y = n) df$x <- rnorm(n = nrow(df), mean = 100,sd = 6) # 修改函数,让它接收嵌套的tibble some_function <- function(y_tbl, x_val){ mean(y_tbl$n) * x_val } # 使用map2_dbl逐行处理y和x,返回数值结果 df %>% mutate(z = map2_dbl(y, x, some_function))
这里map2_dbl会把每行的y(小tibble)和x(数值)传给函数,最后直接返回数值型结果,刚好匹配z列的需求。
方式二:用rowwise逐行计算
如果不想修改函数,可以用rowwise()让mutate逐行处理,这样就能正确访问每行的y$n:
require(tidyverse) # 数据和原函数都不变,仅修改最后计算部分 df %>% rowwise() %>% mutate(z = some_function(y$n, x)) %>% ungroup() # 记得取消rowwise状态,避免后续操作受影响
rowwise()会强制mutate对每一行单独计算,此时y$n就会指向当前行嵌套tibble里的n列。
内容的提问来源于stack exchange,提问作者Robby M
相关产品推荐
相关产品推荐

