首页 > 解决方案 > 如何将整个 data.frame 转换为数字

问题描述

我想将data.frame包含 130 多列的整体转换为数字。

我知道我需要使用as.numeric,但问题是我必须将此函数分别应用于 130 列中的每一列。我试图将其应用于整个data.frame,但收到以下错误消息:

Error: (list) object cannot be coerced to type 'double'

我怎样才能通过相对较短的代码来做到这一点?

标签: rdataframe

解决方案


在基础 R 中,我们可以这样做:

df[] <- lapply(df, as.numeric)

或者

df[cols_to_convert]  <- lapply(df[cols_to_convert], as.numeric)

这是解决方案的基准(忽略有关因素的考虑):

DF <- data.frame(a = 1:10000, b = letters[1:10000],
                 c = seq(as.Date("2004-01-01"), by = "week", len = 10000),
                 stringsAsFactors = TRUE)
DF <- setNames(do.call(cbind,replicate(50,DF,simplify = F)),paste0("V",1:150))

dim(DF)
# [1] 10000   150

library(dplyr)
n1tk  <- function(x) data.frame(data.matrix(x))
mm    <- function(x) {x[] <- lapply(x,as.numeric); x}
akrun <- function(x) mutate_all(x, as.numeric)
mo    <- function(x)  {for(i in 1:150){ x[, i] <- as.numeric(x[, i])}}

microbenchmark::microbenchmark(
  akrun = akrun(DF),
  n1tk  = n1tk(DF),
  mo    = mo(DF),
  mm    = mm(DF)
)

# Unit: milliseconds
#   expr      min        lq       mean    median        uq      max neval
#  akrun 152.9837 177.48150 198.292412 190.38610 206.56800 432.2679   100
#   n1tk  10.8700  14.48015  22.632782  17.43660  21.68520  89.4694   100
#     mo   9.3512  11.41880  15.313889  14.71970  17.66530  37.6390   100
#     mm   4.8294   5.91975   8.906348   7.80095  10.11335  71.2647   100

推荐阅读