gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:25:06 29 4
gpt4 key购买 nike

我一直在玩dplyr::mutate_at通过对某些列应用相同的函数来创建新变量。当我命名我的函数 .funs参数,mutate 调用创建带有后缀的新列而不是替换现有列,这是我在 this thread 中发现的一个很酷的选项.

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而不是 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

我想了解为什么会发生这种行为,以及如何避免它,因为我事先不知道 contains() 有多少列。将返回。

编辑 :
新创建的列必须继承原始列的原始名称,并在末尾加上后缀“sqrt”。

谢谢

最佳答案

这是另一个想法。我们可以添加 setNames(sub("^sqrt$", "other_sqrt", names(.)))mutate_at称呼。想法是替换列名sqrtother_sqrt .图案^sqrt$应该只匹配派生列 sqrt如果只有一列名为 other ,这在示例 1 中进行了演示。如果有不止一列带有 other ,例如示例 2, 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在操作数据框之前。
mutate_sqrt <- function(df, string){
string_col <- grep(string, names(df), value = TRUE)
df2 <- df %>% mutate_at(vars(contains(string)), funs("sqrt" = sqrt(.)))
if (length(string_col) == 1){
df2 <- df2 %>% setNames(sub("^sqrt$", paste(string_col, "sqrt", sep = "_"), names(.)))
}
return(df2)
}

mutate_sqrt(df, "other")
# var1 var2 other other_sqrt
# 1 1 4 9 3
# 2 2 5 9 3

mutate_sqrt(df2, "other")
# var1 var2 other1 other2 other1_sqrt other2_sqrt
# 1 1 4 9 16 3 4
# 2 2 5 9 16 3 4

关于r - mutate_at 在某些情况下不会创建变量后缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48613794/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com