从字符串的data.frame猜测正确的列存储模式

时间:2013-01-14 19:25:09

标签: r

给定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"

理想情况下,遇到错误时,处理此问题的函数会将数据保留为字符串形式。

4 个答案:

答案 0 :(得分:8)

您可以使用colwise包中的plyrtype.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)

使用dplyrmagrittr管道范例,

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