数値の一部がカンマを千区切り記号として文字列として表す csv ファイルがあり"1,513"
ます1513
。データを R に読み込む最も簡単な方法は何ですか?
を使用できますread.csv(..., colClasses="character")
が、それらの列を数値に変換する前に、関連する要素からコンマを取り除く必要があり、それを行うためのきちんとした方法が見つかりません。
read.csv
適切に解釈する方法についてはわかりませんが、 を使用gsub
して に置き換え","
てから、文字列をusing""
に変換できます。numeric
as.numeric
y <- c("1,200","20,000","100","12,111")
as.numeric(gsub(",", "", y))
# [1] 1200 20000 100 12111
これは、R-Help で以前に回答されたものでもあります(およびQ2 here )。
または、たとえばsed
unix でファイルを前処理することもできます。
read.table または read.csv でこの変換を半自動的に行うことができます。最初に新しいクラス定義を作成し、次に変換関数を作成し、次のように setAs 関数を使用して「as」メソッドとして設定します。
setClass("num.with.commas")
setAs("character", "num.with.commas",
function(from) as.numeric(gsub(",", "", from) ) )
次に、次のように read.csv を実行します。
DF <- read.csv('your.file.here',
colClasses=c('num.with.commas','factor','character','numeric','num.with.commas'))
データを前処理するのではなく、データが改訂されたときに簡単になるように、R を使用したいと考えています。を使用するというシェーンの提案に従ってgsub
、これは私ができる限りきちんとしたものだと思います。
x <- read.csv("file.csv",header=TRUE,colClasses="character")
col2cvt <- 15:41
x[,col2cvt] <- lapply(x[,col2cvt],function(x){as.numeric(gsub(",", "", x))})
この質問は数年前のものですが、私は偶然見つけました。つまり、他の人もそうするかもしれません。
readr
ライブラリ/パッケージには、いくつかの優れた機能があります。そのうちの 1 つは、このような「乱雑な」列を解釈するための優れた方法です。
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
これにより、
ソース: ローカル データ フレーム [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
ファイルを読み込むときの重要なポイント: 上記の に関するコメントのように前処理するか、読み込み中sed
に処理する必要があります。多くの場合、事後に問題を修正しようとすると、見つけにくい危険な思い込みが生じます。(これが、そもそもフラットファイルが非常に悪い理由です。)
たとえば、 にフラグを立てていなかったら、次のようにcol_types
なっていました。
> read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5")
Source: local data frame [4 x 1]
numbers
(chr)
1 800
2 1,800
3 3500
4 6.5
(ではなくchr
( ) になっていることに注意してください。)character
numeric
または、より危険なことに、それが十分に長く、初期の要素のほとんどにコンマが含まれていなかった場合:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(最後のいくつかの要素は次のようになります:)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
そうすれば、そのコンマをまったく読むのに苦労するでしょう!
> tail(read_csv(tmp))
Source: local data frame [6 x 1]
3"
(dbl)
1 8.000
2 5.000
3 5.000
4 9.000
5 7.000
6 1.003
Warning message:
1 problems parsing literal data. See problems(...) for more details.
も使用できますreadr::parse_number
が、列は文字でなければなりません。複数の列に適用したい場合は、次を使用して列をループできますlapply
df[2:3] <- lapply(df[2:3], readr::parse_number)
df
# a b c
#1 a 12234 12
#2 b 123 1234123
#3 c 1234 1234
#4 d 13456234 15342
#5 e 12312 12334512
またはmutate_at
fromdplyr
を使用して特定の変数に適用します。
library(dplyr)
df %>% mutate_at(2:3, readr::parse_number)
#Or
df %>% mutate_at(vars(b:c), readr::parse_number)
データ
df <- data.frame(a = letters[1:5],
b = c("12,234", "123", "1,234", "13,456,234", "123,12"),
c = c("12", "1,234,123","1234", "15,342", "123,345,12"),
stringsAsFactors = FALSE)
dplyr
ソリューションmutate_all
次のものがあるとします。
> dft
Source: local data frame [11 x 5]
Bureau.Name Account.Code X2014 X2015 X2016
1 Senate 110 158,000 211,000 186,000
2 Senate 115 0 0 0
3 Senate 123 15,000 71,000 21,000
4 Senate 126 6,000 14,000 8,000
5 Senate 127 110,000 234,000 134,000
6 Senate 128 120,000 159,000 134,000
7 Senate 129 0 0 0
8 Senate 130 368,000 465,000 441,000
9 Senate 132 0 0 0
10 Senate 140 0 0 0
11 Senate 140 0 0 0
年変数 X2014-X2016 からカンマを削除し、数値に変換します。また、X2014-X2016 が要因として読み込まれるとしましょう (デフォルト)
dft %>%
mutate_all(funs(as.character(.)), X2014:X2016) %>%
mutate_all(funs(gsub(",", "", .)), X2014:X2016) %>%
mutate_all(funs(as.numeric(.)), X2014:X2016)
mutate_all
内部の関数funs
を指定された列に適用します
一度に1つの関数で順番に実行しました(内部で複数の関数を使用するfuns
と、追加の不要な列が作成されます)
Rの「前処理」:
lines <- "www, rrr, 1,234, ttt \n rrr,zzz, 1,234,567,987, rrr"
readLines
で使用できますtextConnection
。次に、数字の間にあるコンマのみを削除します。
gsub("([0-9]+)\\,([0-9])", "\\1\\2", lines)
## [1] "www, rrr, 1234, ttt \n rrr,zzz, 1234567987, rrr"
知っておくと便利ですが、この質問に直接関連するわけではありませんが、小数点区切り記号としてのコンマは、read.csv2 (自動的に) または read.table (「dec」パラメーターを設定して) で処理できます。
編集: 後で、新しいクラスを設計して colClasses を使用する方法を発見しました。見る:
数字が「.」で区切られている場合 と "," (1.200.000,00) による小数を呼び出すgsub
必要があります。set fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
私は前処理が行く方法だと思います。正規表現置換オプションを持つNotepad++を使用できます。
たとえば、ファイルが次のような場合:
"1,234","123","1,234"
"234","123","1,234"
123,456,789
次に、正規表現"([0-9]+),([0-9]+)"
を使用して置き換えることができます\1\2
1234,"123",1234
"234","123",1234
123,456,789
次に x <- read.csv(file="x.csv",header=FALSE)
、ファイルを読み取るために使用できます。