mutate_at在某些情况下不会创建变量后缀?

时间:2018-02-04 22:49:40

标签: r dplyr contains mutate

我一直在玩dplyr::mutate_at来创建新变量,方法是将相同的函数应用于某些列。当我在.funs参数中命名我的函数时,mutate调用会创建带有后缀的新列,而不是替换现有的列,这是我在{{3}中发现的一个很酷的选项}。

df = data.frame(var1=1:2, var2=4:5, other=9)
df %>% mutate_at(vars(contains("var")), .funs=funs('sqrt'=sqrt))
####   var1 var2 other var1_sqrt var2_sqrt
#### 1    1    4     9  1.000000  2.000000
#### 2    2    5     9  1.414214  2.236068

但是,我注意到当用于指向我的列的vars参数只返回一列而不是几列时,生成的新列将删除初始名称:它被命名为sqrt而不是{{ 1}}这里:

other_sqrt

我想了解为什么会出现这种情况,以及如何避免这种情况,因为我事先并不知道df %>% mutate_at(vars(contains("other")), .funs=funs('sqrt'=sqrt)) #### var1 var2 other sqrt #### 1 1 4 9 3 #### 2 2 5 9 3 会返回多少列。

修改: 新创建的列必须继承原始列的原始名称,加上后缀' sqrt'最后。

由于

2 个答案:

答案 0 :(得分:2)

这是另一个想法。我们可以在setNames(sub("^sqrt$", "other_sqrt", names(.)))电话后添加mutate_at。我们的想法是将列名sqrt替换为other_sqrt。如果只有一个名为^sqrt$的列,则sqrt模式应仅匹配派生列other,如示例1所示。如果有多个列{{1} },例如示例2,other不会更改列名。

setNames

或者我们可以设计一个函数来在操作数据框之前检查包含字符串library(dplyr) # Example 1 df <- data.frame(var1 = 1:2, var2 = 4:5, other = 9) df %>% mutate_at(vars(contains("other")), funs("sqrt" = sqrt(.))) %>% setNames(sub("^sqrt$", "other_sqrt", names(.))) # var1 var2 other other_sqrt # 1 1 4 9 3 # 2 2 5 9 3 # Example 2 df2 <- data.frame(var1 = 1:2, var2 = 4:5, other1 = 9, other2 = 16) df2 %>% mutate_at(vars(contains("other")), funs("sqrt" = sqrt(.))) %>% setNames(sub("^sqrt$", "other_sqrt", names(.))) # var1 var2 other1 other2 other1_sqrt other2_sqrt # 1 1 4 9 16 3 4 # 2 2 5 9 16 3 4 的列数。

other

答案 1 :(得分:1)

我只是想出了一个(不那么干净)的方法; 我在数据集中添加了一个额外的虚拟变量,其名称确保它将被选中并且我们不会进入1变量的情况,并且在计算之后我删除了2个虚拟变量,如下所示:

df %>% mutate(other_fake=NA) %>% 
  mutate_at(vars(contains("other")), .funs=funs('sqrt'=sqrt)) %>% 
  select(-contains("other_fake"))
####   var1 var2 other other_sqrt
#### 1    1    4     9          3
#### 2    2    5     9          3