【问题标题】:dplyr mutate_at and ifelse() is not vectoriseddplyr mutate_at 和 ifelse() 未矢量化
【发布时间】:2018-01-25 20:58:35
【问题描述】:

我试图在我的数据框中的列子集上使用mutate_at。但是,当我使用的函数是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 的已知行为吗?当我尝试类似的代码但使用不同的功能时,它工作正常。

stack_df %>% mutate_at(.vars = vars(one_of(stack_names)), 
                           funs(. + mean(.)))
#       a  b    c d          e
# 1   6.5 11 46.5 2 -0.4942510
# 2   7.5 12 47.5 2  0.3158461
# 3   8.5 13 48.5 2 -0.7034258
# 4   9.5 14 49.5 2  1.7274836
# 5  10.5 15 50.5 2  0.4617106
# 6  11.5 16 51.5 2 -0.6882656
# 7  12.5 17 52.5 2  0.6196318
# 8  13.5 18 53.5 2  0.8705275
# 9  14.5 19 54.5 2  0.7079841
# 10 15.5 20 55.5 2 -0.1731856

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    ifelse 的第一个参数是长度为 1 的逻辑向量。这样只会得到一个值。见

    ifelse(TRUE, 5:1, 1:5)
    # [1] 5    # one 1 value returned, not 5
    

    当您测试 length(unique(.)) == 1 时,它们只会得到一个 TRUE 或 FALSE,具体取决于列中的所有值是否相同。

    ifelse 的所有参数应该是相同的长度。目前尚不清楚您在这里真正想要做什么,因此解决方案可能是什么并不明显。似乎您可能只想有条件地执行变异或使用mutate_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 length(unique(.)) 未矢量化,它返回单个数字(列的唯一值的数量)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2017-06-18
    相关资源
    最近更新 更多