在数据框指定位置添加列:add_column搭配ifelse报错原因咨询
为什么
add_column和ifelse配合会报错? 这是个很典型的dplyr函数上下文问题,我来给你捋清楚:
核心区别:mutate vs add_column的求值环境
mutate是专门为数据框列计算设计的函数,它会自动把当前管道里的数据集作为求值上下文,所以你直接写Sepal.Length时,它知道去iris数据框里找这个列。- 而
add_column的设计初衷是添加与原数据框无关的固定值/外部变量,它的参数默认是在全局环境(也就是你写代码的顶层环境)里求值的,不会自动关联管道传过来的数据框。
你看你的例子:
- 第二个
add_column用的是固定字符串"Test",这是字面量,不管在哪个环境都能识别,所以没问题; - 第三个
add_column里的Sepal.Length只存在于iris数据框中,全局环境里没有这个对象,自然会报object 'Sepal.Length' not found的错误。
解决方法
方法1:用mutate直接指定位置(推荐)
从dplyr 1.0.0版本开始,mutate支持.before和.after参数,完全可以替代你想要的“创建新列并指定位置”的需求,而且语法更统一:
library(tidyverse) iris %>% mutate(With_mutate = ifelse(Sepal.Length > 4 & Sepal.Width > 3, TRUE, FALSE), .before = "Species") %>% head()
方法2:如果一定要用add_column,显式引用数据框
用管道中的.来指代传过来的iris数据框,这样就能访问到它的列了:
iris %>% add_column(With_add_column = ifelse(.$Sepal.Length > 4 & .$Sepal.Width > 3, TRUE, FALSE), .before = "Species") %>% head()
总结
如果你的新列需要基于原数据框的列计算,优先用带位置参数的mutate;add_column更适合添加独立的固定值列,非要用它计算的话,记得用.显式引用管道里的数据框。
内容的提问来源于stack exchange,提问作者Carpatorus
相关产品推荐
相关产品推荐

