일부 숫자에 쉼표가 천 개의 구분 기호로 포함될 때 데이터를 읽는 방법은 무엇입니까?
값 중 있습니다.를 들어, 저 수 중 일 치 가 부 쉼 로 표 문 는 파 습 니 다 있 고 지 가 일 을 되 표 현 는 로 예를 들어, 1,000개의 구분자를 사용합니다."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(및 여기 2분기)에서도 답변되었습니다.
을 사전 할 수 . 를 들어, " " " " 를 사용할 수 있습니다. 예를 들어,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을 사용하고 싶습니다.셰인의 사용 제안에 따라gsub
저는 이것이 제가 할 수 있는 만큼 깔끔하다고 생각합니다.
x <- read.csv("file.csv",header=TRUE,colClasses="character")
col2cvt <- 15:41
x[,col2cvt] <- lapply(x[,col2cvt],function(x){as.numeric(gsub(",", "", x))})
이 질문은 몇 년 전의 것이지만, 저는 우연히 발견했습니다. 다른 사람들도 그럴 수 있다는 것을 의미합니다.
라이브러리/패키지에는 몇 가지 멋진 기능이 있습니다.그 중 하나는 이런 "엉터리" 열을 해석하는 좋은 방법입니다.
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
부터dplyr
특정 변수에 적용할 수 있습니다.
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)
a 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' 매개 변수 설정)입니다.
편집: 나중에 새로운 클래스를 설계하여 colClass를 사용하는 방법을 알게 되었습니다.참조:
R 숫자 클래스에서 1000 분리기로 df를 로드하는 방법은 무엇입니까?
리더 라이브러리의 일부인 read_delim 함수를 사용하여 추가 매개 변수를 지정할 수 있습니다.
locale = locale(decimal_mark = ",")
read_delim("filetoread.csv", ";", locale = locale(decimal_mark = ","))
*두 번째 줄의 세미콜론은 read_delim이 csv 세미콜론으로 구분된 값을 읽음을 의미합니다.
이렇게 하면 쉼표가 있는 모든 숫자를 올바른 숫자로 읽는 데 도움이 됩니다.
안부 전해요
마테우시 카니아
숫자가 "."로 구분되고 소수가 ","(1.200.000,00)로 구분되는 경우gsub
당신은 해야 한다.set fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
매우 편리한 방법은.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
저는 전처리가 최선의 방법이라고 생각합니다.정규식 바꾸기 옵션이 있는 메모장++을 사용할 수 있습니다.
예를 들어 파일이 다음과 같은 경우:
"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)
파일을 읽습니다.
언급URL : https://stackoverflow.com/questions/1523126/how-to-read-data-when-some-numbers-contain-commas-as-thousand-separator
'source' 카테고리의 다른 글
LAN을 통해 Visual Studio 디버깅 IIS Express 서버에 연결하는 중 (0) | 2023.07.16 |
---|---|
ORDER BY 절을 사용하여 뷰 생성 (0) | 2023.07.16 |
윈도우즈에서 'virtualenv'가 활성화되지 않음 (0) | 2023.07.16 |
Python 실행 파일에서 libpython 공유 라이브러리를 찾을 수 없음 (0) | 2023.07.16 |
여러 줄의 텍스트 블록과 일치하는 정규식 (0) | 2023.07.16 |