【问题标题】:How to convert sapply code into vapply code如何将 sapply 代码转换为 vapply 代码
【发布时间】:2019-10-22 10:34:01
【问题描述】:

有人告诉我在我的代码和函数中尝试使用vapply() 而不是sapply()。我经常使用sapply(),并尝试改用vapply(),但我的一些函数的sapply() 用法相当复杂。

我在下面举了一个例子,希望得到一些关于如何重新生成相同结果但使用vapply()而不是sapply()的指导。

> dput(head(df[1]))
structure(list(D1 = structure(c(WP1 = 47L, WP10 = 17L, WP103 = 21L, 
WP108 = 23L, WP113 = 34L, WP116 = 79L), .Label = c("  0.00", 
"  0.57", " 10.00", "100.00", " 10.20", " 10.26", " 10.34", " 10.53", 
" 10.87", " 11.11", " 11.36", " 11.48", " 11.54", " 11.76", " 11.94", 
" 12.20", " 12.50", " 12.86", " 12.90", "  1.30", " 13.33", " 13.43", 
" 13.46", " 13.64", " 13.73", " 13.75", " 14.00", " 14.29", " 14.63", 
" 14.75", "  1.49", " 15.00", " 15.28", " 15.38", " 15.62", " 15.79", 
"  1.60", " 16.13", " 16.67", " 17.39", " 17.95", " 18.18", " 18.75", 
" 18.97", " 19.05", " 19.44", " 20.00", " 20.20", " 20.59", " 22.03", 
" 22.22", " 22.73", " 23.08", " 23.53", "  2.38", " 24.14", " 25.00", 
" 26.09", "  2.62", " 26.32", " 27.59", "  2.86", " 29.03", "  2.94", 
"  3.23", " 32.69", "  3.30", "  3.33", " 33.33", " 37.50", "  3.85", 
"  3.90", "  3.96", "  4.00", "  4.35", "  4.44", "  4.46", "  4.51", 
"  4.55", "  4.64", "  4.71", "  4.88", " 50.00", "  5.33", "  5.48", 
"  5.88", "  6.07", "  6.19", "  6.22", "  6.38", "  6.63", "  6.67", 
"  6.82", "  6.84", "  6.90", "  6.91", "  7.14", "  7.17", "  7.25", 
" 75.00", "  7.55", "  7.69", "  7.89", "  8.00", "  8.04", "  8.11", 
"  8.33", "  8.43", "  8.57", "  9.09", "  9.52", "  9.93"), class = "factor")), row.names = c("WP1", 
"WP10", "WP103", "WP108", "WP113", "WP116"), class = "data.frame")

这是一个因子数据框,我使用以下代码将其转换为数字数据框。

df[sapply(df, is.factor)] <- lapply(df[sapply(df, is.factor)],
        function(x) as.numeric(as.character(x)))

对于vapply(),我必须提供我正在寻找的输出,我是否会将其包含在sapply() 的两个调用中?

任何帮助或指导将不胜感激。

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    将 sapply 替换为:

    vapply(df, is.factor, logical(1))
    

    【讨论】:

    • 谢谢你这很好。逻辑(1)中的(1)究竟是做什么的?
    • 它告诉vapply每个is.factor函数调用的结果长度为1并且类型为逻辑,即TRUE或FALSE。
    【解决方案2】:

    转换很简单,只要

    1. 函数的返回类是FUN.VALUE的类。
    2. FUN.VALUE 的长度与函数输出的长度相匹配。

    首先,分两部分:

    i_log <- vapply(df, is.factor, logical(1))
    df[i_log] <- vapply(df[i_log],
                        function(x) as.numeric(as.character(x)), numeric(nrow(df)))
    

    只需一条指令:

    df[vapply(df, is.factor, logical(1))] <- vapply(df[vapply(df, is.factor, logical(1))],
                                        function(x) as.numeric(as.character(x)), numeric(nrow(df)))
    

    【讨论】:

    • 感谢您的回复和解释,答案导致错误 'Error in logical(ncol(df)) : invalid 'length' argument'。
    • 对不起,你是对的。 is.factor 返回 1 个值,不多 (ncol(df))。您发布的数据有 1 列,因此两者相等。将编辑。
    猜你喜欢
    • 2017-09-16
    • 2012-02-25
    • 1970-01-01
    • 2022-12-02
    • 2022-12-30
    • 2020-11-04
    • 2021-10-22
    • 2019-11-19
    • 2017-10-16
    相关资源
    最近更新 更多