在dataframe中的特定位置创建列

时间:2018-01-17 09:42:32

标签: r tidyverse tibble

我想在特定位置创建一个新变量。我可以使用mutate创建变量,然后使用select重新排序,但我宁愿选择tibble:add_column方式。

这是虹膜数据集的一个简单示例:

library(tidyverse)
## This works fine
iris %>% mutate(With_mutate = ifelse(Sepal.Length > 4 & Sepal.Width > 3 , TRUE, FALSE)) %>% 
         select(Sepal.Length:Petal.Width, With_mutate, everything()) %>%
         head()

## This works also
iris %>% add_column(With_add_column = "Test", .before = "Species") %>%
head()

## This doesn't work
iris %>% add_column(With_add_column = ifelse(Sepal.Length > 4 & Sepal.Width > 3 , TRUE, FALSE), .before = "Species") %>%
head()
Error in ifelse(Sepal.Length > 2 & Sepal.Width > 1, TRUE, FALSE) :
  object 'Sepal.Length' not found

如果有人能告诉我为什么ifelse声明不适用于add_column,我将不胜感激。

1 个答案:

答案 0 :(得分:6)

原因是mutatesummarise等基于指定符号获取列值,但此处add_column不会。因此,我们可以使用.$

提取列
iris %>% 
   add_column(With_add_column = ifelse(.$Sepal.Length > 4 & 
                                 .$Sepal.Width > 3 , TRUE, FALSE), .before = "Species") %>%
   head()
#Sepal.Length Sepal.Width Petal.Length Petal.Width With_add_column Species
#1          5.1         3.5          1.4         0.2            TRUE  setosa
#2          4.9         3.0          1.4         0.2           FALSE  setosa
#3          4.7         3.2          1.3         0.2            TRUE  setosa
#4          4.6         3.1          1.5         0.2            TRUE  setosa
#5          5.0         3.6          1.4         0.2            TRUE  setosa
#6          5.4         3.9          1.7         0.4            TRUE  setosa

为了使其紧凑,逻辑条件的值为TRUE/FALSE因此,我们不需要ifelse

add_column(With_add_column = .$Sepal.Length > 4 & .$Sepal.Width > 3, .before = "Species")

可以取代第二步