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

パッケージと機能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))
于 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

パイプラインパラダイムを使用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、変数を変換するdoubleと元の値の精度が失われる(つまり、分析のコンテキスト内で重要な小数点以下の桁数が失われる)場合に警告します。

于 2016-04-21T13:48:19.933 に答える