dplyr mutate_at和ifelse()未矢量化

dplyr mutate_at和ifelse()未矢量化,r,dplyr,R,Dplyr,我试图在数据框中的一部分列上使用mutate_。但是,当我使用的函数是ifelse时,它似乎不是矢量化的 例如,下面的代码应该给出与原始输入相同的输出 set.seed(1) stack_names <- c('a','c','d','e') stack_df <- data.frame(a = 1:10, b = 11:20, c = 21:30, d = rep(1, 10), e = rnorm(10)) # a b c d e # 1 1

我试图在数据框中的一部分列上使用mutate_。但是,当我使用的函数是ifelse时,它似乎不是矢量化的

例如,下面的代码应该给出与原始输入相同的输出

set.seed(1)
stack_names <- c('a','c','d','e')
stack_df <- data.frame(a = 1:10, b = 11:20, c = 21:30, d = rep(1, 10), e = rnorm(10))

#     a  b  c d          e
# 1   1 11 21 1 -0.6264538
# 2   2 12 22 1  0.1836433
# 3   3 13 23 1 -0.8356286
# 4   4 14 24 1  1.5952808
# 5   5 15 25 1  0.3295078
# 6   6 16 26 1 -0.8204684
# 7   7 17 27 1  0.4874291
# 8   8 18 28 1  0.7383247
# 9   9 19 29 1  0.5757814
# 10 10 20 30 1 -0.3053884

stack_df %>% mutate_at(.vars = vars(one_of(stack_names)), 
                         funs(ifelse(length(unique(.)) == 1, ., .)))
#    a  b  c d          e
# 1  1 11 21 1 -0.6264538
# 2  1 12 21 1 -0.6264538
# 3  1 13 21 1 -0.6264538
# 4  1 14 21 1 -0.6264538
# 5  1 15 21 1 -0.6264538
# 6  1 16 21 1 -0.6264538
# 7  1 17 21 1 -0.6264538
# 8  1 18 21 1 -0.6264538
# 9  1 19 21 1 -0.6264538
# 10 1 20 21 1 -0.6264538
ifelse的第一个参数是长度为1的逻辑向量。这样你只会得到一个值。看

ifelse(TRUE, 5:1, 1:5)
# [1] 5    # one 1 value returned, not 5
当你测试lengthunique时根据列中的所有值是否相同,1只会得到一个TRUE或FALSE

ifelse的所有参数都应该是相同的长度。现在还不清楚你到底想做什么,所以不清楚解决方案是什么。看起来您可能只是想有条件地执行mutate或使用mutate\u if或某种类型。当然,也许你只需要一个常规的if语句

myfun <- function(x) {
    if (length(unique(x)) == 1) x else x
}
stack_df %>% mutate_at(.vars = vars(one_of(stack_names)), funs(myfun))
ifelse的第一个参数是长度为1的逻辑向量。这样你只会得到一个值。看

ifelse(TRUE, 5:1, 1:5)
# [1] 5    # one 1 value returned, not 5
当你测试lengthunique时根据列中的所有值是否相同,1只会得到一个TRUE或FALSE

ifelse的所有参数都应该是相同的长度。现在还不清楚你到底想做什么,所以不清楚解决方案是什么。看起来您可能只是想有条件地执行mutate或使用mutate\u if或某种类型。当然,也许你只需要一个常规的if语句

myfun <- function(x) {
    if (length(unique(x)) == 1) x else x
}
stack_df %>% mutate_at(.vars = vars(one_of(stack_names)), funs(myfun))
^卑诗省伦图尼克。未矢量化,它返回一个数字,即列的唯一值数。^bc lengthunique。如果不进行矢量化,则返回一个数字,即列的唯一值的数目。