2012-12-04 19 views
23

このサイトにも同様の質問があることは知っていますが、私の質問には十分に答えていないようです。csvファイルをR数値に読み込むと、文字として読み込まれます

を私はExcelで開いたCSVファイルを持っている:

これは私がこれまで行っているものです。私は新しい列 "A"を得るために代数的に列を操作します。 read.csv()を使用してファイルをRにインポートし、列Aのエントリを要素として格納します。数値として格納します。私はトピックにこの質問を見つける:アドバイスに従い

Imported a csv-dataset to R but the values becomes factors

、私はread.csv()で引数としてstringsAsFactors = FALSEが含ま香港大井は、上記のリンク先ページで提案されているように、しかし、これは内のエントリを起こしません列Aは数値として格納されます。列項目のエントリがあるように、しかし、私は、ファイルをインポートする方法、すなわちクリーナーソリューションをご希望の

How to convert a factor to an integer\numeric without a loss of information?

可能な解決策は、以下のページで与えられたアドバイスを使用することです数値として格納されます。

何か助けてくれてうれしい! read.csv(... stringsAsFactors=FALSE)を使用してRに(いずれかの操作を得意とする前に)ファイルを読む:あなたが新しい列を作成するために、Excelでやっているどのような代数

+5

Excelがテキストファイルでホースれます。テキストエディタでcsvを開き、Excelがどのようにマングリングしているかを確認します。 –

+2

小数点記号に問題はありますか? CSVファイルで使用する小数点記号を確認してください。 'read.csv'の' dec'オプションで小数点記号として使用する文字を指定することができます。詳細は '?read.csv'を参照してください。 – djhurio

+0

ジョシュアがあなたに言わせることは、CSVヘッダーを破壊する傾向として優れています。通常、私はオプションを使用して(stringsAsFactors = FALSE)これらの要因を避けるために。 –

答えて

22

はおそらく

次のことを試してみてくださいR.で、より効果的に行うことができます。 [それでも問題が解決しない場合は?read.tableread.csvが表示されます)をご覧ください。例えば

delim = "," # or is it "\t" ? 
    dec = "." # or is it "," ? 
    myDataFrame <- read.csv("path/to/file.csv", header=TRUE, sep=delim, dec=dec, stringsAsFactors=FALSE) 

それでは、あなたの数値列を言わせて、あなたがRであなたが「同じタスクを実行すると任意の助けが必要な場合は、列4

myDataFrame[, 4] <- as.numeric(myDataFrame[, 4]) # you can also refer to the column by "itsName" 


最後ですExcelでやったことは、あなたを助けてくれる人がたくさんいます。

+0

ありがとうございます。これは非常に有用なチェックリストです。この例では、ExcelではなくRで代数操作を行うことで問題を解決しました。 – user32259

+0

問題は@ user32259、喜んで助けてください –

9

read.table(およびその親類)i tは、どの文字列が欠損値として解釈されるかを指定するna.strings引数です。NA。デフォルト値はna.strings = "NA"

です。そうでなければ数値変数の列の欠損値が "NA"以外のものとしてコード化されていると、 "."または "N/A"の場合、これらの行はcharacterと解釈され、列全体がcharacterに変換されます。

したがって、値が「NA」以外の場合は、na.stringsに指定する必要があります。

3

大規模なデータセット(例:列数の多いデータセットの場合)、上記の解決策は手作業で煩雑になる可能性があり、数値の列がどれかを知る必要があります。先験

代わりにこれを試してください。

char_data <- read.csv(input_filename, stringsAsFactors = F) 
num_data <- data.frame(data.matrix(char_data)) 
numeric_columns <- sapply(num_data,function(x){mean(as.numeric(is.na(x)))<0.5}) 
final_data <- data.frame(num_data[,numeric_columns], char_data[,!numeric_columns]) 

コードは以下のん:

  1. は、文字列としてデータをインポートします。
  2. データのインスタンスを数値列として作成します。
  3. データのどの列が数値かを示します(データを数値に変換する際に50%未満のNaAsが実際に数値であると仮定します)。
  4. 数字列と文字列を最終データセットにマージします。

元の列のデータ型(文字と数値)を保持することによって、本質的に.csvファイルのインポートを自動化します。

1

dmanugeからのコードに基づいてdata.table用のバージョン:

convNumValues<-function(ds){ 
    ds<-data.table(ds) 
    dsnum<-data.table(data.matrix(ds)) 
    num_cols <- sapply(dsnum,function(x){mean(as.numeric(is.na(x)))<0.5}) 
    nds <- data.table( dsnum[, .SD, .SDcols=attributes(num_cols)$names[which(num_cols)]] 
         ,ds[, .SD, .SDcols=attributes(num_cols)$names[which(!num_cols)]]) 
return(nds) 
} 
関連する問題