2017-04-08 6 views
0

VBA를 사용하여 Excel에서이를 수행하는 것은 간단합니다. 그러나 확장 된 데이터 분석, 플로팅 기능을 위해서는 R을 사용해야합니다. 장비의 소프트웨어는 .csv 파일 만 출력하고 헤더는 포함하지 않습니다. 분석을 위해 별도로 읽어야합니다.ASCII를 사용하지 않고 머리글 (-er)을 읽는 방법, R을 사용하여 특정 행을 식별하는 방법?

내가 뭘하려고 (해야) :

  • 헤더 (4 열)하지 않고 여러 .CSV을 읽어보십시오. 각 파일은 이름, 이름으로 만 구분할 수 있습니다.
  • 각 파일에서 특정 행을 적게 선택하십시오. 예 : 첫 번째 열이 인 행 = 101, 열 값 = 201 등. 각 파일에는 500 행만 있습니다. 나는이 특정 행을 읽어 여기 어딘가에 루프에 대한 필요가 감지 (?)
  • 스토어 값 위의 모든 파일에 대한 데이터 프레임에
  • 이에 대한 몇 가지 통계를 계산
  • 플롯을 합계는
  • 결과
  • 최종 출력 데이터 프레임 통계 분석 엑셀로 플롯은, 이미, 데이터 프레임에 R, 저장소를 사용 .CSV 판독 데이터 프레임 항목 및 플롯 분석을 수행하는 방법을 시도

을 .csv로. 이 프로세스 흐름은 각 장비 실행마다 매일 반복됩니다. 두 가지 도구를 실행합니다. 매번 실행할 수있는 코드 스 니펫을 저장하려고합니다.

내가 직면 한 유일한 문제는 특정 행을 찾는 방법을 잘 모르겠습니다. 다음 문제는 Excel로 출력하는 방법입니다.

.CSV 입력 파일 형식 :

V1, V2, V3, V4 
numeric (0 decimals), numeric (with 4 decimals), alpha num, alpha num 
001, 12.8975, XY03, XY05 
... 
485, 89.2134, XY02, XY7 

업데이트 1 : 인해 악기 자상 일부 변경, 대신 CSV의 files are in ASCII format합니다. 이것은 많은 한계를 가져옵니다. ASCII를 지원하기 위해 raster 패키지를 설치하는 문제. 대신 다음을 사용하십시오. sql을 지원하기 위해 sqldf 패키지를 설치했습니다. 그러나 이는 오류를 발생시킵니다.

> fl1 <- read.table("~/rcodes/dt07042017/fileone.ASC", sep=",") 
--read ok 
> sv1 <- sqldf('select FNAME "F1", V2, V3, V4 from fl1 where V1 in (101, 201, 301)') 
Warning message: Quoted identifiers should have class SQL, use DBI::SQL() 
if the caller performs the quoting. 

설치 한 DBI 패키지. 그것이 무엇을 확신하지 못합니다. SQL이 작동했습니다. 이 파일은 단지 하나의 파일이며 1000 개의 파일을 읽고 특정 행 값을 선택하여 하나의 테이블/df에 저장해야합니다. 다음과 같은 점선을 썼습니다. 파일 이름을 삽입 할 수있는 방법을 찾지 못해 실패합니다. 나는 R.에서 SQL을 사용하지 매우 행복하고

> df <- NULL 
> fn <- NULL 
> n <- 1 
> for (f in files) { 
+  fn <- file_path_sans_ext(f) 
+  df0 <-read.table(f, sep=",") 
+  n <- n + 1 
+  df <- sqldf('select n, fn, V1, V2 from df0 
where V1 IN (101, 201, 301, 401)') 
-- thought R could read fn just as df0 
+  df <- rbind(df) --further fn and n only reads two files 
+ } 
Error in rsqlite_send_query([email protected], statement) : 
no such column: n, df1 

SQL 패키지를 사용하여 위의 완수하지 않고이 작업을 수행하는 R의 다른 방법이 있습니까?

UPDATE 대신 해당 열에 2시 20분 값 (18 값)을 받고 3

, 내가 그렇게 할 수있는 방법 (20)에 2 행의 평균을 얻고 싶은 ?

#set working directly to the folder where csv files are located 
files <- list.files(pattern='.csv') 
m = data.frame() 
for (k in 1:length(files)){ 
    +  csv = read.csv(files[k], header = FALSE) 
    #picking up 2:20 consecutive values, value for row 50,120,150 so on 
    +  data = csv[c(2:20, 50, 120, 150, 175, 200), c(1,2)] 
    #-pivot transform col/row- data <- as.data.frame(t(data)) 
    #but that line screwed up the data 
    #when those selected values are with NA/blanks 
     data$file = files[k] 
    +  m = rbind(m, data) 
} 
+1

csv 파일의 예를 제공해주세요. Excel에서 결과를 내보내는 데 사용할 수있는 패키지는 매우 많습니다.'WriteXLS','xlsx'는 그 중 일부입니다. – nicola

+0

파일의 크기는 얼마입니까? 그리 많지 않다면 모든 것을 읽은 다음 나중에 부분 집합을 읽을 수 있습니다. 첫 x 째 컬럼이 201 인 행만 선택하려면'x <-read.csv (yourfile); x <-x [x [[1]] == 201,]'와 같이하십시오. – nicola

+0

새 컬럼을 추가 할 수 있습니까? R로 읽을 때 각 파일 데이터를 식별 할 수 있습니까? 데이터 요소는 신원 정보를 필요로합니다. 나는 다음 반나 동안 떨어져있을 것이다. 나는 내가 작성한 업데이트를 게시 할 것이다. 그런 다음 댓글을 쓸 수 있다면 좋을 것입니다. – bonCodigo

답변

1

"ASCII 파일"이 무슨 의미인지는 알 수 없습니다. 다음 내용이 귀하의 문제와 상당히 유사하기를 바랍니다. 다음 파일이 있다고 가정 해보십시오.

파일 1CSV

101 0.8117 AFWSK QSZDP 
099 0.4594 MDKKK DHVAH 
301 0.8730 HMRCR PQSMB 
012 0.4705 OHHZL CIKVM 
012 0.1335 KKEHQ YFNJU 
201 0.2967 XFIPZ PMNYT 
301 0.2470 WKLIV TBHZP 
101 0.9182 SSEHT QYBUW 
101 0.8076 VKRSO BUGJL 
301 0.5861 PICFN UFTWC 

path/to/my/dir라는 디렉토리에 저장된 파일 2.csv

201 0.0767 FHWLL FZKQF 
301 0.3176 HDBVJ EIUNJ 
301 0.9606 LHODD XRYFE 
301 0.8327 NKGVT LYTUJ 
012 0.8073 KOBXD GBEFA 
099 0.9414 ZCOCX ENFAV 
101 0.3683 UTBUG RKIQU 
012 0.1515 XXJZI MEWVI 
012 0.0383 IUKQQ PAIFV 
301 0.2304 GKIKJ GEOZT 

. 이 디렉토리에도 다른 파일이 있지만 데이터가 포함 된 파일 이름이 [0-9]+.csv 형식의 이름 (예 : .csv 다음에 오는 숫자)이라는 것을 알고 있다고 가정 해보십시오. 당연히 당신은 그들 중 다수가 있고 그들의 이름은 다를 수 있습니다; 질문에는 이것에 관한 힌트가 전혀 포함되어 있지 않으므로이 예제를 실제 문제에 적용 할 수 있기를 기대하면서 예제를 제공하고 있습니다. 이제

:

#you get the name of all files. No manual typing. 
filenames<-list.files(path="path/to/my/dir",pattern="[0-9]+\\.csv",full.names=TRUE) 
#reading them all 
dataFiltered<-sapply(filenames,function(x) { 
        y<-read.table(x) 
        y[y[[1]] %in% c(101, 201, 301),]},simplify=FALSE) 
finalRes<-cbind(do.call(rbind,dataFiltered), 
      fileOrigin=rep(names(dataFiltered),vapply(dataFiltered,nrow,1L))) 

같은 것을 활용하려면 다음

# V1  V2 V3 V4 fileOrigin 
#1 101 0.8117 AFWSK QSZDP  1.csv 
#2 301 0.8730 HMRCR PQSMB  1.csv 
#3 201 0.2967 XFIPZ PMNYT  1.csv 
#4 301 0.2470 WKLIV TBHZP  1.csv 
#5 101 0.9182 SSEHT QYBUW  1.csv 
#6 101 0.8076 VKRSO BUGJL  1.csv 
#7 301 0.5861 PICFN UFTWC  1.csv 
#8 201 0.0767 FHWLL FZKQF  2.csv 
#9 301 0.3176 HDBVJ EIUNJ  2.csv 
#10 301 0.9606 LHODD XRYFE  2.csv 
#11 301 0.8327 NKGVT LYTUJ  2.csv 
#12 101 0.3683 UTBUG RKIQU  2.csv 
#13 301 0.2304 GKIKJ GEOZT  2.csv 

위의 작동합니다,하지만 메모리 비용이 될 수 있습니다. 많은 수의 파일이있는 경우, 묶음으로 읽은 다음 위의 내용을 각 묶음에 적용하는 것이 좋습니다. 즉, filenames 개체를 모두 sapply으로 전달하지는 않지만 완료 할 때까지 해당 하위 집합을 전달할 수 있습니다.

결국 rbind 모두 finalRes입니다.

+0

니스! 그러나 파일 이름은 동적입니다. 1000 파일의 파일을 저장할 수 있으며 매일 모든 파일 이름을 벡터에 입력 할 시간을 낭비 할 필요가 없습니다. 왜 파일을 반복하지 않는거야? – bonCodigo

+0

나는 csv 파일을 읽으려면 "/ 즉흥적"버전의/other 코드를 사용하고 있습니다. 예 csv를 읽는 데 필요한 라이브러리를 설치했으며 모든 ASC를 csv 파일로 변경했습니다. – bonCodigo

+0

현재 버전의 코드로 내 질문을 업데이트하고 있습니다. 내가 원한 것은 한 컬럼에있는 다양한 데이터 값의 평균/평균을 읽는 것입니다. 예 : 2:20 범위. 어떻게해야할지 모르겠다. 나는 몇 가지 변종을 시도, 모두가 지금까지 실패했습니다. – bonCodigo