为何map2()函数无法识别我的列名?
问题:使用purrr::map2()调用命名列表列时出现找不到对象的错误
我在用tidyverse中purrr包的map2()函数,从包含向量的列表列中选取元素。用通用列名的模拟示例可以正常运行:
df <- tibble( x = list(1:3, 4:6), y = c(2, 3) ) # 这段代码正常运行: df %>% mutate(z = unlist(map2(x, y, ~ .x[.y])))
但当我把该列命名为vol后,purrr无法找到该列:
df <- df %>% mutate(vol = x) # 这段代码运行出错 df %>% mutate(z = unlist(map2(vol, y, ~ .vol[.y])))
错误信息如下:
Error in
mutate():
! Problem while computingz = unlist(map2(vol, y, ~.vol[.y])).
Caused by error in.f():
! object '.vol' not found
解决方法
问题出在lambda表达式的参数引用上:purrr的map2()函数中,lambda表达式的默认参数是.x和.y,分别对应传入的第一个和第二个参数,和列名本身无关。你把第一个参数换成vol列后,错误地使用了.vol作为引用,这是不存在的变量。
正确的写法是保持用.x引用第一个传入的参数(即vol列):
df %>% mutate(z = unlist(map2(vol, y, ~ .x[.y])))
或者你可以显式指定参数名称,让代码逻辑更清晰:
df %>% mutate(z = unlist(map2(vol, y, function(vol_col, y_val) vol_col[y_val])))
内容的提问来源于stack exchange,提问作者mferreira
相关产品推荐
相关产品推荐

