有人告诉我,我的代码和功能尝试使用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()
的两个调用中都包含此输出?
任何帮助或指导将不胜感激。
答案 0 :(得分:5)
替换为:
vapply(df, is.factor, logical(1))
答案 1 :(得分:1)
只要
,转换就很简单FUN.VALUE
的类。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)))