我一直在玩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'最后。
由于
答案 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