2012-08-25 4 views
0

분석을 위해 우리는 분석을하기 전에 csv (xls) &에서 원시 데이터를 SAS 데이터 세트로 변환해야합니다.SAS 또는 R에서 원시 데이터 읽기

이제이 원시 데이터에는 일반적으로 이라는 두 가지 문제가 있습니다. 1. 열 순서가 변경되는 경우가 있습니다. 따라서 이전 기간에 변수 A, B, C 순으로 열이있는 경우 B, C, A로 바뀔 수 있습니다. 2. "#"또는 " . "또는"some letters "등 이제 SAS로 읽어 오기 전에 원시 데이터를 먼저 정리해야합니다. 이것은 상당한 시간이 걸립니다. 데이터를 읽기 전에 SAS 시스템 자체의 데이터를 정리할 수있는 방법이 있습니까? SAS 코드로 데이터를 수정할 수 있다면 상당한 시간을 절약 할 수 있습니다.

기간 : 1 :

다음은 예제 내가이 형식으로 Data1.csv의 데이터를 얻었다. 숫자 B 인 B 열에는 "#"& "이 (가) 있습니다." 그리고 colummn C (숫자이기도 함)는 "g"입니다. PROC IMPORT 또는 Infile 문을 사용하여 Data1.csv를 가져 오면 B 열 & C의 이러한 외부 요소는 그대로 유지됩니다. 여기에있는 질문은 그것을하는 방법입니다. STATEMENT를 사용할 수 있습니다. 그러나 문제는 "#", ".", "g"대신에 "$", "h"등과 같은 다른 외부 요소를 가질 수있는 너무 많은 외부 요소가 있다는 것입니다. 우리가 가질 수있는 방법이 있다면 &을 감지하는 코드는 SAS에서 원시 데이터를 가져올 때마다 IF STATEMENT를 사용하여 지정하지 않고 외부 요소를 제거합니다.

A B C 
Name1 1 5 
Name2 2 6 
Name3 3 4 
Name4 # g 
Name5 5 3 
Name6 . 6 

기간이 아래에 주어진 내가 DATA2.csv있어이 기간에. INFILE 문을 사용할 때 첫 번째 A는 특정 이름으로 읽은 다음 B는 특정 이름 &, C로 읽어야한다고 지정합니다. 두 번째 기간에는 데이터 B가 첫 번째로옵니다. 그래서 SAS가 A 대신 B를 사용하여 데이터를 읽었을 때, 매번 &의 infile 문을 사용하여 데이터를 읽기 전에 이전 단계 데이터로 정렬하는 변수를 확인해야합니다. 변수의 수가 너무 많으므로 이러한 방식으로 열 순서를 확인하는 데 시간이 많이 걸립니다 (& 시간이 지남). SAS가 자동으로 A, &, 그 다음 B &, C 순으로 읽는 SAS 코드가 있습니까?

B A C 
1 Name1 5 
2 Name2 6 
3 Name3 4 
# Name4 g 
5 Name5 3 
. Name6 6 

비록 주로 분석 목적으로 SAS를 사용하지만. 그러나 R을 사용하여 데이터를 정리 한 다음 SAS에서 추가 분석을 위해 사용합니다. 그래서 R 코드도 도움이 될 수 있습니다.

감사합니다.

답변

3

R에서는 열이 특정 클래스임을 지정하면 파일 읽기 속도가 빨라집니다. 가운데 하나 인 상태 (3 열을 제공하는 예를 통해 "문자"당신은이 코드를 사용할 수 있습니다 : "."

dat <- read.csv(filename, colClasses=c("numeric", "character", "numeric"), comment.char="") 

은 "#"및 숫자 열에서 발생 때 NA 값을 될 것입니다 위의 코드를. . 당신이 "#"과를 원한다면 "#"입니다 주석 문자의 기본 사양을 제거 NA_character_ 강제 변환 할 문자 열의 항목이 코드를 사용할 수 있습니다 ".": 기본적으로

dat <- read.csv(filename, 
       colClasses=c("numeric", "character", "numeric"), 
       comment.char="", 
       na.strings=c("NA", ".", "#")) 

header=TRUE 설정은 read.csv()에 의해 가정되지만, read.table()을 사용하는 경우 header=TRUE을 두 파일 구조로 어 써트해야합니다. yo u는 보여 줬다. 추가 문서 및 worked examples of reading Excel data here:하지만, 내 조언은 당신이 계획하고 CSV 전송을 사용하는 것입니다. 엑셀이 날짜와 누락 된 값으로 더 신속하게 작업하는 것을 보게 될 것입니다. 데이터 형식을 POSIX 표준과 일치하는 사용자 정의 "yyyy-mm-dd"로 변경하는 것이 좋습니다.이 경우 "날짜"분류 열을 지정하고 문자 분류 열을 선으로 바꾸는 프로세스를 건너 뛸 수 있습니다. 기본 Excel 형식 (모두 나쁜)을 날짜로 변환합니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 문제는 데이터 세트에서 3 가지 외부 요소 만 있다는 것을 보여줍니다. 그러나 각 단계에서 그들은 점점 커지고 있습니다. 이제 모든 외국 요소를 추적하고 코드를 업데이트하는 작업은 시간이 많이 걸립니다. 그래서 자동으로 코드를 작성할 수있는 코드 예제를 요청했습니다. 하지만 당신의 제안에 따라 CSV를 읽으려고 노력할 것입니다. – Beta

2

예, SAS를 사용하여 상상할 수있는 모든 종류의 "데이터 정리"를 수행 할 수 있습니다. SAS DATA 스텝 언어는 이런 일을 할 수있는 기능으로 가득차 있지만 마법의 총알은 없습니다. 직접 코드를 작성해야합니다.

csv 파일은 일반 텍스트 파일 (매우 xls 파일과 다릅니다)입니다. 일반적으로 csv 파일의 첫 번째 행에는 열 이름이 포함되고 데이터는 두 번째 행으로 시작됩니다. PROC IMPORT을 사용하는 경우 SAS는 첫 번째 행을 사용하여 변수 이름을 구성하고 파일의 첫 번째 여러 행을 검색하여 데이터 유형을 확인합니다. 예 :

proc import datafile='c:\temp\somefile.csv' 
    out=SASdata 
    dbms=csv replace; 
run; 

또는 데이터 단계로 파일을 읽을 수 있습니다. 이렇게하려면 미리 파일 레이아웃을 알고 있어야합니다.예를 들면 다음과 같습니다.

data SASdata; 
    infile 'c:\temp\somefile.csv' dsd firstobs=2 lrecl=32767 truncover; 
    informat A $50.; /* A character variable with max length 50 */ 
    informat B yymmdd10.; /* A date presented like 2012-08-25 */ 
    informat C dollar12.; /* A number containing dollar sign, commas, or decimals */ 

    input A B C; /* The order of the variables in the file */ 

    if B = . then B = today(); /* A possible data cleaning statement */ 
run; 

INPUT 문은 변수가 파일에 존재하는 순서를 제어합니다. 요점은 사용하는 코드가 처리하는 각 파일의 레이아웃과 일치해야한다는 것입니다.

이는 일반적인 의견 일뿐입니다. 문제가 발생하면보다 구체적인 질문을 게시하십시오.

업데이트 된 질문 업데이트 : 원시 데이터 파일의 변수는 각 파일에있는 것과 같은 순서로 INPUT 문에 나열되어야합니다. 또한 열 유형을 직접 정의하고 따라야하는 규칙을 설정해야합니다. 이 작업을 자동으로 수행 할 방법이 없습니다. 각 파일은 개별적으로 처리해야합니다.

이 경우 변수가 A, B 및 C라고 가정합니다. 여기서 A는 문자이고 B와 C는 숫자입니다. 이 프로그램은 두 파일을 모두 처리하고 이력 데이터 세트에 추가 할 수 있습니다 (의이 ALLDATA을 가정 해 봅시다) : 각 데이터 단계의 "데이터 정의"부분이 동일하다는 것을

data temp; 
    infile 'c:\temp\data1.csv' dsd firstobs=2 lrecl=32767 truncover; 
    /* Define dataset variables */ 
    informat A $50.; 
    informat B 12.; 
    informat C 12.; 
    /* Add a KEEP statement to keep only the variables you want */ 
    keep A B C; 

    input A B C; 
run; 
proc append base=ALLDATA data=temp; 
run; 
data temp; 
    infile 'c:\temp\data2.csv' dsd firstobs=2 lrecl=32767 truncover; 
    informat A $50.; 
    informat B 12.; 
    informat C 12.; 

    input B A C; 
run; 
proc append base=ALLDATA data=temp; 
run; 

공지 사항; 유일한 차이점은 INPUT 문에 나열된 변수의 순서입니다. 변수 A와 B가 숫자로 정의 되었기 때문에 잘못된 문자가 읽혀질 때 (#와 g) 값은 누락 된 값으로 저장됩니다.

귀하의 경우, 필요한 모든 변수를 원하는 순서로 정의하기 위해 템플릿 SAS 프로그램을 만들 것입니다. 그런 다음 해당 템플릿을 사용하여 해당 파일의 변수 순서를 사용하여 각 파일을 가져옵니다. 템플릿 프로그램을 설정하는 데는 시간이 걸릴 수 있지만 실행하려면 INPUT 문만 수정하면됩니다.

+0

답장을 보내 주셔서 감사합니다. 나는 나의 질문을 더 구체적으로 말하려고 애썼다. – Beta

+0

감사합니다. Bob! proc append는 흥미로운 아이디어입니다. – Beta

관련 문제