r - 如何将整个 data.frame 转换为数字
问题描述
我想将data.frame
包含 130 多列的整体转换为数字。
我知道我需要使用as.numeric
,但问题是我必须将此函数分别应用于 130 列中的每一列。我试图将其应用于整个data.frame
,但收到以下错误消息:
Error: (list) object cannot be coerced to type 'double'
我怎样才能通过相对较短的代码来做到这一点?
解决方案
在基础 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
推荐阅读
- ios - 在所有 iOS 设备上唯一识别信标(iBeacon 和 Eddy Stone)
- csv - bigquery 加载自定义记录分隔符
- sql - 为什么这个 SQL 返回 null?
- c++ - ./rcpp: 没有这样的文件或目录:cpp 目标文件的运行时错误
- azure - Thingworx Platform-settings.json 文件未连接到 azure 数据库
- javascript - svg.js 动画组合的情节和 dmove
- android - 如何在全屏范围内打开 AlertDialog
- c++ - 在 C/C++ 中将联合字段中的位解释为不同的数据类型
- python - Python 多处理池在 for 循环中返回相同的输出
- c# - C# - 如何在 AppData 目录中安装数据库?