给定data.frame
只包含字符串的列(无因子),其中一些应保留字符串,其中一些是整数,其中一些是双精度,我怎么能猜出最合适的存储模式哪个转换字符串?
fixDf <- data.frame(isChar=c("A", "B", "C"),
isDouble=c("0.01", "0.02", "0.03"),
isInteger=c("1", "2", "3"), stringsAsFactors=FALSE)
我想知道是否有一种简单的方法可以确定需要完成以下操作,然后执行此操作:
mode(fixDf[, "isDouble"]) <- "double"
mode(fixDf[, "isInteger"]) <- "integer"
理想情况下,遇到错误时,处理此问题的函数会将数据保留为字符串形式。
答案 0 :(得分:8)
您可以使用colwise
包中的plyr
和type.convert
功能。
library(plyr)
foo = colwise(type.convert)(fixDf)
str(foo)
'data.frame': 3 obs. of 3 variables:
$ isChar : Factor w/ 3 levels "A","B","C": 1 2 3
$ isDouble : num 0.01 0.02 0.03
$ isInteger: int 1 2 3
或使用基础R:
as.data.frame(lapply(fixDf, type.convert))
答案 1 :(得分:2)
一种方式:
foo <- read.table(text=capture.output(fixDf))
str(foo)
# 'data.frame': 3 obs. of 3 variables:
# $ isChar : Factor w/ 3 levels "A","B","C": 1 2 3
# $ isDouble : num 0.01 0.02 0.03
# $ isInteger: int 1 2 3
答案 2 :(得分:0)
使用dplyr
和magrittr
管道范例,
library(dplyr)
fixDf <- fixDf %>%
mutate_each(
funs(
type.convert(as.character(.), as.is = TRUE, numerals = "warn.loss")
)
)
在您的情况下,不需要as.character
强制函数,但是如果您没有意识到您的一个或多个列不是字符变量,那么这是一个好的做法 - {{1需要字符变量作为输入。
type.convert
可防止从字符到因素的强制,as.is = TRUE
在将变量转换为numerals = warn.loss
时会发出警告会导致原始值失去准确性(即丢失重要的小数位)分析的背景)。
答案 3 :(得分:0)
type_convert
可在整个数据帧上完全满足您的要求。它可以很好地处理逻辑,数字(整数和双精度),字符串和日期/时间,而无需强制执行因子分解。
type_convert(fixDf)
要单独解析列,请使用parse_guess
。