일부 숫자에 쉼표가 천 개의 구분 기호로 포함될 때 데이터를 읽는 방법은 무엇입니까?
값 중 있습니다.를 들어, 저 수 중 일 치 가 부 쉼 로 표 문 는 파 습 니 다 있 고 지 가 일 을 되 표 현 는 로 예를 들어, 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 |