일부 숫자 값이 쉼표가있는 문자열로 표현되는 csv 파일 "1,513"
이 1513
있습니다. 예를 들어 . 데이터를 R로 읽는 가장 간단한 방법은 무엇입니까?
를 사용할 수는 read.csv(..., colClasses="character")
있지만 해당 열을 숫자로 변환하기 전에 관련 요소에서 쉼표를 제거해야하며 깔끔한 방법을 찾을 수 없습니다.
답변
확실하지에 대해 어떻게해야하는 read.csv
제대로 해석,하지만 당신은 사용할 수있는 gsub
대체하기 ","
로 ""
하고, 다음에 문자열을 변환 numeric
사용 as.numeric
:
y <- c("1,200","20,000","100","12,111")
as.numeric(gsub(",", "", y))
# [1] 1200 20000 100 12111
이것은 또한 이전에 R-Help (및 Q2 여기 ) 에서 답변 되었습니다 .
또는 예를 들어 sed
유닉스에서 파일을 사전 처리 할 수 있습니다 .
답변
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을 사용하고 싶습니다. Shane의 제안에 따라 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
라이브러리 / 패키지는 몇 가지 좋은 기능을 가지고 있습니다. 그중 하나는 이와 같은 “지저분한”열을 해석하는 좋은 방법입니다.
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.
답변
및 파이프를 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
지정된 열에 내부 함수를 적용합니다.
한 번에 하나의 함수를 순차적으로 수행했습니다 (내부에서 여러 함수를 사용 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))