7

给定一个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

4 回答 4

12

您可以colwiseplyr包和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))
于 2013-01-14T19:32:39.023 回答
5

type_convertfrom readr完全符合您的要求,对整个数据帧进行操作。它可以很好地处理逻辑、数字(整数和双精度)、字符串和日期/时间,而不会强制分解。

type_convert(fixDf)

要单独解析列,请使用parse_guess.

于 2019-08-01T06:09:28.970 回答
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
于 2013-01-14T19:35:32.700 回答
0

使用dplyrmagrittr管道范式,

library(dplyr)

fixDf <- fixDf %>% 
  mutate_each(
    funs(
      type.convert(as.character(.), as.is = TRUE, numerals = "warn.loss")
    )
  )

在您的情况下,as.character不需要强制函数,但最好包括以防万一您没有意识到您的一个或多个列不是字符变量 -type.convert需要字符变量作为输入。

as.is = TRUE防止从字符到因子的强制转换,并numerals = warn.loss在将变量转换为时发出警告double会导致原始值失去准确性(即丢失在分析上下文中重要的小数位)。

于 2016-04-21T13:48:19.933 回答