it-swarm.dev

일부 숫자에 천 단위 구분 기호로 쉼표가 포함 된 경우 데이터를 읽는 방법은 무엇입니까?

Csv 파일이 있는데 일부 숫자 값은 쉼표가 천 단위 구분 기호로 문자열로 표시됩니다 (예 : "1,513" 대신 1513. R로 데이터를 읽는 가장 간단한 방법은 무엇입니까?

read.csv(..., colClasses="character")을 사용할 수 있지만 해당 열을 숫자로 변환하기 전에 관련 요소에서 쉼표를 제거해야하며 깔끔한 방법을 찾을 수 없습니다.

112
Rob Hyndman

데이터를 수정할 때 더 쉽게 데이터를 사전 처리하는 대신 R을 사용하고 싶습니다. gsub 사용에 대한 Shane의 제안에 따르면, 이것이 가능한 한 깔끔하다고 생각합니다.

x <- read.csv("file.csv",header=TRUE,colClasses="character")
col2cvt <- 15:41
x[,col2cvt] <- lapply(x[,col2cvt],function(x){as.numeric(gsub(",", "", x))})
16
Rob Hyndman

read.csv가 올바르게 해석하는 방법을 모르지만 gsub를 사용하여 ","""로 바꾸고 문자열을 numericas.numeric 사용 :

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

이것은 이전에 R-Help에서 응답 (그리고 Q2 here )였습니다.

또는 유닉스에서 sed를 사용하여 파일을 사전 처리 할 수 ​​있습니다.

134
Shane

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'))
54
Greg Snow

이 질문은 몇 살이지만, 나는 그것을 우연히 발견했습니다.

readr 라이브러리/패키지에는 멋진 기능이 있습니다. 그중 하나는 "지저분한"열을 해석하는 좋은 방법입니다.

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. 
12
Mike Williamson

mutate_all 및 파이프를 사용하는 dplyr 솔루션

다음이 있다고 가정하십시오.

> 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_allfuns 안의 함수를 지정된 열에 적용합니다.

한 번에 하나씩 함수를 순차적으로 수행했습니다 (funs 안에 여러 함수를 사용하는 경우 불필요한 추가 열을 작성합니다)

7
Paul

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를로드하는 방법은 무엇입니까?

6
42-

숫자가 "."으로 분리 된 경우 gsub를 호출 할 때 ","(1.200.000,00)로 소수는 set fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))

4
aca

전처리가 갈 길이라고 생각합니다. 정규식 바꾸기 옵션이있는 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)을 사용하여 파일을 읽을 수 있습니다.

2
Jacob

매우 편리한 방법은 readr::read_delim-가족. 여기에서 예를 들면 다음과 같습니다. 여러 구분 기호가있는 csv를 R로 가져 오기 다음과 같이 할 수 있습니다.

txt <- 'OBJECTID,District_N,ZONE_CODE,COUNT,AREA,SUM
1,Bagamoyo,1,"136,227","8,514,187,500.000000000000000","352,678.813105723350000"
2,Bariadi,2,"88,350","5,521,875,000.000000000000000","526,307.288878142830000"
3,Chunya,3,"483,059","30,191,187,500.000000000000000","352,444.699742995200000"'

require(readr)
read_csv(txt) # = read_delim(txt, delim = ",")

예상되는 결과는 무엇입니까?

# A tibble: 3 × 6
  OBJECTID District_N ZONE_CODE  COUNT        AREA      SUM
     <int>      <chr>     <int>  <dbl>       <dbl>    <dbl>
1        1   Bagamoyo         1 136227  8514187500 352678.8
2        2    Bariadi         2  88350  5521875000 526307.3
3        3     Chunya         3 483059 30191187500 352444.7
2
Rentrop

readr 라이브러리의 일부인 read_delim 함수를 사용하여 추가 매개 변수를 지정할 수 있습니다.

locale = locale(decimal_mark = ",")

read_delim("filetoread.csv", ';", locale = locale(decimal_mark = ","))

* 두 번째 줄의 세미콜론은 read_delim이 csv 세미콜론으로 구분 된 값을 읽음을 의미합니다.

이렇게하면 쉼표가있는 모든 숫자를 적절한 숫자로 읽는 데 도움이됩니다.

문안 인사

마테우스 카 니아

0
Mateusz Kania

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

또는 dplyr에서 mutate_at를 사용하여 특정 변수에 적용하십시오.

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)
0
Ronak Shah

Y <-as.numeric (gsub ( ",", "", as.character (y)))처럼 복잡하지 않으며 열 중 하나 일 경우 y $ 2로 하위 집합을 지정할 수 있습니다. y $ 2 <-as.numeric (gsub ( ",", "", as.character (y $ 2)))와 같이

0
Colonelxy

다른 해결책 :

 y <- c("1,200","20,000","100","12,111") 

 as.numeric(unlist(lapply( strsplit(y,","),paste, collapse="")))

gsub보다 상당히 느릴 것입니다.

0
liujx80