138

数値の一部がカンマを千区切り記号として文字列として表す csv ファイルがあり"1,513"ます1513。データを R に読み込む最も簡単な方法は何ですか?

を使用できますread.csv(..., colClasses="character")が、それらの列を数値に変換する前に、関連する要素からコンマを取り除く必要があり、それを行うためのきちんとした方法が見つかりません。

4

11 に答える 11

155

read.csv適切に解釈する方法についてはわかりませんが、 を使用gsubして に置き換え","てから、文字列をusing""に変換できます。numericas.numeric

y <- c("1,200","20,000","100","12,111")
as.numeric(gsub(",", "", y))
# [1]  1200 20000 100 12111

これは、R-Help で以前に回答されたものでもあります(およびQ2 here )。

または、たとえばsedunix でファイルを前処理することもできます。

于 2009-10-06T01:18:26.910 に答える
68

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'))
于 2010-08-31T17:34:19.503 に答える
20

データを前処理するのではなく、データが改訂されたときに簡単になるように、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))})
于 2009-10-06T03:15:28.000 に答える
16

この質問は数年前のものですが、私は偶然見つけました。つまり、他の人もそうするかもしれません。

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( ) になっていることに注意してください。)characternumeric

または、より危険なことに、それが十分に長く、初期の要素のほとんどにコンマが含まれていなかった場合:

> 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. 
于 2015-09-17T23:31:30.057 に答える
8

も使用できます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_atfromdplyrを使用して特定の変数に適用します。

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)
于 2019-08-12T10:50:41.770 に答える
8

とパイプを使用した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と、追加の不要な列が作成されます)

于 2015-03-28T05:31:18.387 に答える
6

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 を使用する方法を発見しました。見る:

Rで1000セパレータを数値クラスとしてdfをロードする方法は?

于 2009-10-08T01:09:15.687 に答える
4

数字が「.」で区切られている場合 と "," (1.200.000,00) による小数を呼び出すgsub必要があります。set fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))

于 2014-02-07T14:34:47.123 に答える
0

私は前処理が行く方法だと思います。正規表現置換オプションを持つ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)、ファイルを読み取るために使用できます。

于 2009-10-06T01:47:26.320 に答える