R语言管道中使用pull()与c()组合向量的异常问题
为什么magrittr管道中使用pull()+c()会返回嵌套列表?
问题根源:管道的参数传递逻辑
magrittr的%>%管道默认会把左侧的对象作为第一个参数传给右侧的函数。你写的管道代码:
hflights %>% c(pull(.,Origin), pull(.,Dest)) %>% unique()
实际等价于:
unique(c(hflights, pull(hflights, Origin), pull(hflights, Dest)))
这里c()的第一个参数是整个hflights数据框,而不是你预期的两个向量。因为数据框本质是列表结构,c()在合并数据框和向量时,会把它们都当作列表元素拼接,最终得到的是一个包含数据框、两个向量的嵌套列表,再用unique()自然返回嵌套列表结果。
而你的正常写法:
c(origins, destinations) %>% unique()
origins和destinations都是pull()提取的向量,c()直接把两个向量合并成一个大向量,去重后自然是正常的向量结果。
正确的管道写法
要让管道里的c()只接收两个pull()出来的向量,需要用{}包裹右侧代码,阻止管道自动传递左侧对象作为第一个参数:
hflights %>% {c(pull(., Origin), pull(., Dest))} %>% unique()
或者换一种思路,先提取列再转成向量:
hflights %>% select(Origin, Dest) %>% unlist() %>% unique()
内容的提问来源于stack exchange,提问作者Charles Knell
相关产品推荐
相关产品推荐

