R 스크립트에서 직접 Excel 파일 읽기


95

Excel 파일을 R로 직접 읽는 방법은 무엇입니까? 아니면 먼저 데이터를 텍스트 또는 CSV 파일로 내보내고 해당 파일을 R로 가져와야합니까?


@Sacha Epskamp : xlsReadWrite를 사용하면 Perl을 설치할 필요도 없습니다.
Joris Meys

1
gdata버전 2.8.2 xlsxread.xls함수로 파일을 읽습니다
Ben

1
Excel에서 텍스트 형식으로 데이터를 내보낼 경우 정밀도 손실 가능성에 대한 경고 (아래 답변)를 참조하십시오.
russellpierce 2014 년

1
xlsxxlsx / xlsm / xls 용 패키지, xlam 등에 대해 모릅니다.
Qbik

2
"먼저 텍스트 파일로 내 보내지 않을 이유가 없습니다." 방법 : CSV로 내보낼 때 필요한 필드 중 하나가 작성되지 않습니다. 일종의 DRM처럼 보이지만 스프레드 시트를 작성하지 않았기 때문에 모르겠습니다.
Nate Reed

답변:


41

예. R wiki의 관련 페이지를 참조하십시오 . 짧은 대답 : 패키지 read.xls에서 gdata대부분의 경우 작동합니다 (시스템에 Perl을 설치해야하지만 일반적으로 MacOS 및 Linux에서는 이미 적용되지만 Windows에서는 추가 단계가 필요합니다. http://strawberryperl.com/ 참조) ). R wiki 페이지에는 다양한주의 사항과 대안이 있습니다.

이 작업을 직접 수행하지 않는 유일한 이유는 스프레드 시트에 결함 (이상한 머리글, 여러 워크 시트)이 있는지 확인하기 위해 스프레드 시트를 검사 할 수 있기 때문입니다 (분명히 모든 항목을 반복 할 수 있지만 한 번에 하나씩 만 읽을 수 있음). , 포함 된 플롯 등). 그러나 평범한 숫자와 문자 데이터 (즉, 쉼표 형식의 숫자, 날짜, 0으로 나누기 오류가있는 수식, 결 측값 등이 아닌)가있는 잘 구성된 직사각형 스프레드 시트의 경우 일반적으로 문제가 없습니다. 이 과정에서.


6
개인적으로 겪은 많은 잠재적 인 문제가 있습니다. 쉼표가있는 숫자가있는 필드는 제거하고 R에서 숫자로 변환해야합니다. "-"가있는 필드는 NA로 다시 코딩해야합니다. 전반적인 권장 사항은 Excel에서 숫자를 실제로보고 R로 올바르게 변환되는지 확인하는 것입니다.
Brandon Bertelsen

3
"당신은 정말로 당신의 숫자를 볼 필요가있다"라고 논쟁 할 수 없습니다. ... "-"필드의 문제는 무엇입니까? 않는 na.strings="-"문제를 해결? 이러한 문제 중 일반적인 문제는 몇 개이며 XLConnect ...와 같은 다른 도구로 해결할 수있는 문제 (예 : 쉼표가있는 숫자 필드)는 얼마나됩니까?
Ben Bolker

1
그 의견은 당신 Ben이 아니라 OP에 대한 것입니다.
Brandon Bertelsen

1
관련 일화 : read.xls곳 모두 Excel 파일에서 매우 큰 시트를 읽기에 성공 XLConnectxlsx실패 (그들은 모두에 의존하기 때문에 내가 믿는 아파치 POI )
매트 파커

49

@Chase 권장 사항을 다시 반복하겠습니다 . XLConnect를 사용하십시오 .

XLConnect를 사용하는 이유는 다음과 같습니다.

  1. 크로스 플랫폼. XLConnect는 Java로 작성되므로 R 코드를 변경하지 않고 Win, Linux, Mac에서 실행됩니다 (경로 문자열 제외).
  2. 로드 할 다른 항목이 없습니다. XLConnect를 설치하기 만하면됩니다.
  3. Excel 파일 읽기만 언급했지만 XLConnect는 셀 서식 변경을 포함하여 Excel 파일도 작성합니다. Win뿐만 아니라 Linux 또는 Mac에서도이 작업을 수행합니다.

XLConnect는 다른 솔루션에 비해 다소 새롭기 때문에 블로그 게시물 및 참조 문서에서 자주 언급되지 않습니다. 저에게는 매우 유용했습니다.


48

그리고 이제 readxl이 있습니다 .

readxl 패키지를 사용하면 Excel에서 R로 데이터를 쉽게 가져올 수 있습니다. 기존 패키지 (예 : gdata, xlsx, xlsReadWrite 등)에 비해 readxl은 외부 종속성이 없으므로 모든 운영 체제에서 쉽게 설치하고 사용할 수 있습니다. 단일 시트에 저장된 테이블 형식 데이터와 함께 작동하도록 설계되었습니다.

readxl은 libxls C 라이브러리 위에 구축되어 기본 바이너리 형식의 많은 복잡성을 추상화합니다.

레거시 .xls 형식과 .xlsx를 모두 지원합니다.

readxl은 CRAN에서 구할 수 있거나 다음을 사용하여 github에서 설치할 수 있습니다.

# install.packages("devtools")
devtools::install_github("hadley/readxl")

용법

library(readxl)

# read_excel reads both xls and xlsx files
read_excel("my-old-spreadsheet.xls")
read_excel("my-new-spreadsheet.xlsx")

# Specify sheet with a number or name
read_excel("my-spreadsheet.xls", sheet = "data")
read_excel("my-spreadsheet.xls", sheet = 2)

# If NAs are represented by something other than blank cells,
# set the na argument
read_excel("my-spreadsheet.xls", na = "NA")

참고 설명은 '외부 의존성'말한다 동안 것을, 그것은 필요합니까 Rcpp패키지 차례 (Windows 용) Rtools 또는 (OSX 용) 엑스 코드, 필요 하다 많은 사람들이 다른 이유로 설치 R. 비록 외부 종속성을 .


3
xlsx보다 훨씬 빠릅니다. 읽기 시간은 read.xlsx2와 비슷하지만 유형을 유추합니다.
Steve Rowe

1
@SteveRowe이 확인 일부 (시도) 객관적인 벤치 마크에 대한 새로운 해답 참조
MichaelChirico

사용하여 요소로 문자열을 읽는 방법이 read_excel있습니까? 에 비해 속도가 마음에 read.xlsx들지만 열을 문자에서 요소로 수동으로 변환해야하는 것은 목적에 맞지 않습니다.
coip

2
종속성이 없다는 사실에 +1. 나는 자바를 설치하는 것을 싫어한다. 그리고 나는 그것을 시도했고 그것은 나를 위해 아주 잘 작동합니다.
Bastian

2
readxl 및 openxlsx가 최고입니다. readxl은 더 빠르지 만 쓰기를 허용하지 않습니다. 어쨌든 열 클래스 / 유형을 지정하려고 할 때 제대로 작동하지 않습니다.
skan

29

EDIT 2015 년 10 월 : 다른 사람이 여기에 댓글을 달았 것처럼 openxlsxreadxl패키지는 훨씬 빠르게보다가있는 xlsx패키지 실제로 큰 Excel 파일 (> 1500 행 &> 120 열) 열 관리 할 수 있습니다. @MichaelChirico는 readxl속도가 선호 될 때 더 나은 것을 보여주고 패키지에서 openxlsx제공하는 기능을 대체합니다 xlsx. 당신이 읽고, 쓰고, 2015 년 Excel 파일을 수정할 수있는 패키지를 찾고있는 경우, 선택 openxlsx대신를 xlsx.

2015 년 이전 : xlsx패키지를 사용했습니다 . Excel 및 R을 사용하여 워크 플로를 변경했습니다. 더 이상 Excel 시트를 .txt 형식으로 저장할 것인지 묻는 성가신 팝업이 표시되지 않습니다. 이 패키지는 Excel 파일도 작성합니다.

그러나 read.xlsx큰 Excel 파일을 열 때 기능이 느립니다. read.xlsx2함수는 상당히 빠르지 만 data.frame 열의 벡터 클래스를 쿼리하지 않습니다. 함수 colClasses를 사용하는 경우 원하는 컬럼 클래스를 지정 하려면 명령을 사용해야 read.xlsx2합니다. 다음은 실용적인 예입니다.

read.xlsx("filename.xlsx", 1)파일을 읽고 data.frame 열 클래스를 거의 유용하게 만들지 만 큰 데이터 세트의 경우 매우 느립니다. .xls파일 에서도 작동 합니다.

read.xlsx2("filename.xlsx", 1)더 빠르지 만 열 클래스를 수동으로 정의해야합니다. 바로 가기는 명령을 두 번 실행하는 것입니다 (아래 예 참조). character사양은 열을 요인으로 변환합니다. 시간에 대한 사용 DatePOSIXct옵션.

coln <- function(x){y <- rbind(seq(1,ncol(x))); colnames(y) <- colnames(x)
rownames(y) <- "col.number"; return(y)} # A function to see column numbers

data <- read.xlsx2("filename.xlsx", 1) # Open the file 

coln(data)    # Check the column numbers you want to have as factors

x <- 3 # Say you want columns 1-3 as factors, the rest numeric

data <- read.xlsx2("filename.xlsx", 1, colClasses= c(rep("character", x),
rep("numeric", ncol(data)-x+1)))

25

Excel 파일을 읽는 다양한 방법 R과 여기에 많은 답변 이 확산 되어 있으므로 여기에 언급 된 옵션 중 어떤 옵션이 가장 효과적인지 (몇 가지 간단한 상황에서) 조명하려고 노력할 것이라고 생각했습니다.

나는 내가 사용 xlsx하기 시작한 이래로 R관성에 대해 사용 하고 있으며 최근에 어떤 패키지가 더 잘 작동하는지에 대한 객관적인 정보가없는 것으로 보입니다.

일부 패키지는 특정 상황을 다른 것보다 더 잘 처리하고 다른주의 사항이 폭포수이므로 모든 벤치마킹 연습은 어려움이 있습니다.

즉, 꽤 일반적인 형식 (8 개의 문자열 필드, 3 개의 숫자, 1 개의 정수, 3 개의 날짜)으로 생각되는 (재현 가능한) 데이터 세트를 사용하고 있습니다.

set.seed(51423)
data.frame(
  str1 = sample(sprintf("%010d", 1:NN)), #ID field 1
  str2 = sample(sprintf("%09d", 1:NN)),  #ID field 2
  #varying length string field--think names/addresses, etc.
  str3 = 
    replicate(NN, paste0(sample(LETTERS, sample(10:30, 1L), TRUE),
                         collapse = "")),
  #factor-like string field with 50 "levels"
  str4 = sprintf("%05d", sample(sample(1e5, 50L), NN, TRUE)),
  #factor-like string field with 17 levels, varying length
  str5 = 
    sample(replicate(17L, paste0(sample(LETTERS, sample(15:25, 1L), TRUE),
                                 collapse = "")), NN, TRUE),
  #lognormally distributed numeric
  num1 = round(exp(rnorm(NN, mean = 6.5, sd = 1.5)), 2L),
  #3 binary strings
  str6 = sample(c("Y","N"), NN, TRUE),
  str7 = sample(c("M","F"), NN, TRUE),
  str8 = sample(c("B","W"), NN, TRUE),
  #right-skewed integer
  int1 = ceiling(rexp(NN)),
  #dates by month
  dat1 = 
    sample(seq(from = as.Date("2005-12-31"), 
               to = as.Date("2015-12-31"), by = "month"),
           NN, TRUE),
  dat2 = 
    sample(seq(from = as.Date("2005-12-31"), 
               to = as.Date("2015-12-31"), by = "month"),
           NN, TRUE),
  num2 = round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L),
  #date by day
  dat3 = 
    sample(seq(from = as.Date("2015-06-01"), 
               to = as.Date("2015-07-15"), by = "day"),
           NN, TRUE),
  #lognormal numeric that can be positive or negative
  num3 = 
    (-1) ^ sample(2, NN, TRUE) * round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L)
)

나는 그 다음이 스레드에서 언급 된 패키지의 4 벤치마킹, CSV로 쓴 및 LibreOffice와 오픈하고 .XLSX 파일로 저장 : xlsx, openxlsx, readxl,과 gdata, 기본 옵션을 사용하여 (나는 또한 버전을 시도할지 여부 I 열 유형을 지정하지만 순위는 변경되지 않았습니다).

RODBCLinux를 사용 하고 있기 때문에 제외하고 있습니다 . XLConnect주된 목적은 단일 Excel 시트로 읽는 것이 아니라 전체 Excel 통합 문서를 가져 오는 것이므로 읽기 기능에만 경쟁을 벌이는 것은 불공평 해 보입니다. 그리고 xlsReadWrite더 이상 호환의 내 버전이기 때문에 R(폐지 된 것으로 보인다).

그런 다음 NN=1000LNN=25000L( data.frame위 의 각 선언 전에 시드 재설정) 벤치 마크를 실행 하여 Excel 파일 크기와 관련된 차이점을 허용했습니다. gc주로를위한 xlsx것으로, 때때로 메모리 막힘을 일으킬 수 있음을 발견했습니다. 더 이상 고민하지 않고 찾은 결과는 다음과 같습니다.

1,000 행 Excel 파일

benchmark1k <-
  microbenchmark(times = 100L,
                 xlsx = {xlsx::read.xlsx2(fl, sheetIndex=1); invisible(gc())},
                 openxlsx = {openxlsx::read.xlsx(fl); invisible(gc())},
                 readxl = {readxl::read_excel(fl); invisible(gc())},
                 gdata = {gdata::read.xls(fl); invisible(gc())})

# Unit: milliseconds
#      expr       min        lq      mean    median        uq       max neval
#      xlsx  194.1958  199.2662  214.1512  201.9063  212.7563  354.0327   100
#  openxlsx  142.2074  142.9028  151.9127  143.7239  148.0940  255.0124   100
#    readxl  122.0238  122.8448  132.4021  123.6964  130.2881  214.5138   100
#     gdata 2004.4745 2042.0732 2087.8724 2062.5259 2116.7795 2425.6345   100

그래서 readxl함께 승자이며, openxlsx경쟁과 gdata분명한 패자는. 열 최소값을 기준으로 각 측정 값을 취합니다.

#       expr   min    lq  mean median    uq   max
# 1     xlsx  1.59  1.62  1.62   1.63  1.63  1.65
# 2 openxlsx  1.17  1.16  1.15   1.16  1.14  1.19
# 3   readxl  1.00  1.00  1.00   1.00  1.00  1.00
# 4    gdata 16.43 16.62 15.77  16.67 16.25 11.31

우리는 내가 좋아하는 xlsx것보다 60 % 더 느립니다 readxl.

25,000 행 Excel 파일

시간이 많이 걸리기 때문에 더 큰 파일에서 20 번만 반복했습니다. 그렇지 않으면 명령이 동일했습니다. 다음은 원시 데이터입니다.

# Unit: milliseconds
#      expr        min         lq       mean     median         uq        max neval
#      xlsx  4451.9553  4539.4599  4738.6366  4762.1768  4941.2331  5091.0057    20
#  openxlsx   962.1579   981.0613   988.5006   986.1091   992.6017  1040.4158    20
#    readxl   341.0006   344.8904   347.0779   346.4518   348.9273   360.1808    20
#     gdata 43860.4013 44375.6340 44848.7797 44991.2208 45251.4441 45652.0826    20

다음은 관련 데이터입니다.

#       expr    min     lq   mean median     uq    max
# 1     xlsx  13.06  13.16  13.65  13.75  14.16  14.13
# 2 openxlsx   2.82   2.84   2.85   2.85   2.84   2.89
# 3   readxl   1.00   1.00   1.00   1.00   1.00   1.00
# 4    gdata 128.62 128.67 129.22 129.86 129.69 126.75

그래서 readxl그 속도에 관해서 명확한 승자입니다. gdataExcel 파일을 읽는 속도가 느리기 때문에 다른 작업을 수행하는 것이 좋습니다.이 문제는 더 큰 테이블에서만 악화됩니다.

두의립니다 openxlsx광범위한 다른 방법은 () 일 수 있습니다 readxl할 수 있도록 설계되었습니다 아마 그렇게 빠른 이유의 일부), 특히이다 한 가지 write.xlsx이상 단점의 기능, 2) ( readxl)에 col_types의 인수 readxl(로 만 이 글을 쓰는)의 일부 비표준를 받아 들인다 R: "text"대신 "character"하고 "date"대신 "Date".


XLConnect에 대한 벤치 마크도 추가하면 좋을 것입니다. 또한 readxl이 쓸 수 없다는 의견을 말하십시오. xlsx 및 openxlsx는 col_types 또는 colClasses 옵션과 함께 제대로 작동하지 않습니다.
skan

@skan 처음에는 몇 가지 테스트를 실행 XLConnect했지만 매우 느립니다. 나는 readxl마지막 단락에서의 단점을 충분히 다루었 다고 생각 한다. 내가 가진 당신과 더 비슷한 경험이 없다 xlsx또는 openxlsx나는 정기적으로 유형을 지정하는 데 모두 사용 등을.
MichaelChirico


13
library(RODBC)
file.name <- "file.xls"
sheet.name <- "Sheet Name"

## Connect to Excel File Pull and Format Data
excel.connect <- odbcConnectExcel(file.name)
dat <- sqlFetch(excel.connect, sheet.name, na.strings=c("","-"))
odbcClose(excel.connect)

개인적으로 RODBC를 좋아하고 추천 할 수 있습니다.


7
주의 사항 : ODBC는 Windows 이외의 플랫폼에서 실행하기가 까다로울 수 있습니다.
JD Long

1
@JD Long 및 심지어 Windows에서도 PITA입니다. 64 비트 W7에 나와 ODBC에 대한 섹시한 시간이 없다 ...
로마 Luštrik

4
필수 패키지로드 : odbcConnectExcel (file.name)의 RODBC 오류 : odbcConnectExcel은 32 비트 Windows에서만 사용할 수 있습니다
andrekos


6

또 다른 해결책은 xlsReadWrite추가 설치가 필요하지 않지만 처음 사용하기 전에 추가 shlib를 다운로드해야하는 패키지입니다.

require(xlsReadWrite)
xls.getshlib()

이것을 잊어 버리면 완전히 좌절 할 수 있습니다. 거기에 모든 것 ...

참고 : 텍스트 기반 형식 (예 : csv)으로 변환하고 거기에서 읽어 보는 것이 좋습니다. 여러 가지 이유가 있습니다.

  • 솔루션 (RODBC, gdata, xlsReadWrite)이 무엇이든 데이터가 변환 될 때 이상한 일이 발생할 수 있습니다. 특히 날짜는 다소 번거로울 수 있습니다. HFWutils패키지 (@ 벤 Bolker의 코멘트 당) EXCEL 날짜를 다루는 몇 가지 도구가 있습니다.

  • 큰 시트가있는 경우 텍스트 파일을 읽는 것이 EXCEL에서 읽는 것보다 빠릅니다.

  • .xls 및 .xlsx 파일의 경우 다른 솔루션이 필요할 수 있습니다. 예를 들어 xlsReadWrite 패키지는 현재 .xlsx AFAIK를 지원하지 않습니다. gdata.xlsx 지원을 위해 추가 perl 라이브러리를 설치해야합니다. xlsx패키지는 동일한 이름의 확장을 처리 할 수 ​​있습니다.


팁에 대한 @Ben Thx, 내 대답에 포함하겠습니다. 그러나 위키 페이지에서 허용되는 답변 링크가 이미 완성 되었기 때문에 나는 완성하려고 노력하지 않았습니다. 그러나 HFWutils 패키지는 언급하지 않습니다.
Joris Meys

1
-1; 내 대답을 참조하십시오. TL : DR : Excel은 csv (또는 클립 보드)에 전체 정밀도 데이터 세트를 저장하지 않습니다. 보이는 값만 유지됩니다.
russellpierce 2014 년

5

다른 많은 답변에서 위에서 언급했듯이 XLS / X 파일에 연결하고 합리적인 방법으로 데이터를 가져 오는 좋은 패키지가 많이 있습니다. 그러나 어떤 상황에서도 클립 보드 (또는 .csv) 파일을 사용하여 Excel에서 데이터를 검색해서는 안된다는 경고를 받아야합니다. 이유를 확인하려면 =1/3Excel에서 셀에 입력하십시오 . 이제 눈에 보이는 소수점 수를 2로 줄이십시오. 그런 다음 데이터를 복사하여 R에 붙여 넣습니다. 이제 CSV를 저장합니다. 두 경우 모두 Excel이 인터페이스를 통해 표시되는 데이터 만 유지하고 실제 원본 데이터의 모든 정밀도를 잃어버린 것을 알 수 있습니다.


1
숫자 충실도가 관련성이 없거나 중요하지 않다고 누가 생각했는지 알고 싶습니다.
russellpierce

1
좋은 경고입니다. 그러나 사용하는 패키지에 따라 다릅니다. 일부는이 함정에 빠지지 않습니다.
RockScience

@RocketScience 이것은 Excel의 CSV 내보내기에서 기본적인 디자인 선택입니다. 이 문제가없는 클립 보드를 사용하는 패키지의 예가 있습니까? xls xlsx 파일을 직접 구문 분석하는 패키지는이 함정에 빠지지 않는 경향이 있습니다. 따라서 내 경고의 특정 범위.
russellpierce

Unix에서는 gnumeric::read.gnumeric.sheet. Windows에서 나는 100 % 확신하지만 난 생각 gdata::read.xls도 잘 작동한다 (필요 펄하지만 설치)
RockScience

@RockScience 정중하게, gdata :: read.xls는 클립 보드 데이터에서 작동하지 않으며 (당신이 방해하지 않는 한) gnumeric은 Excel이 아닙니다. 따라서 특별한 증거가 없으면 경고가 나타납니다. 이 질문에 대한 응답으로 다른 많은 좋은 옵션이 있습니다. 사람들이 대신 사용하기를 바랍니다.
russellpierce

5

@Mikko가 제공하는 답변을 확장하면 열 클래스를 미리 "알지"않고도 깔끔한 트릭을 사용하여 작업 속도를 높일 수 있습니다. 간단하게 사용하는 read.xlsx클래스를 결정하기 위해 기록 제한된 수의 잡아하고 그것을 추적read.xlsx2

# just the first 50 rows should do...
df.temp <- read.xlsx("filename.xlsx", 1, startRow=1, endRow=50) 
df.real <- read.xlsx2("filename.xlsx", 1, 
                      colClasses=as.vector(sapply(df.temp, mode)))

1
귀하의 솔루션은 반환 numeric을 위해 factors내 컴퓨터에 설치합니다. read.xlsx용도 characterreadColumns기능 요소를 지정합니다. 요소를 문자로 가져 오는 더 우아한 방법이 있다고 확신하지만 다음은 작동하는 함수의 수정 된 버전입니다 df.real <- read.xlsx2("filename.xlsx", 1, colClasses=gsub("factor", "character", as.vector(sapply(df.temp, class)))).
Mikko

이것은 열 유형이 첫 번째 행에 의해 적절하게 결정될 수있는 범위에서만 작동합니다. 일반적으로 하나는 첫 번째 행보다 더 많이 구문 분석하여 결정을 내립니다. 이러한 함수가 나오는 패키지의 이름을 지정하여 aaa90210의 의견을 해결하도록 대답을 개선 할 수 있습니다.
russellpierce

1

Excel 파일은 다음과 같이 R로 직접 읽을 수 있습니다.

my_data <- read.table(file = "xxxxxx.xls", sep = "\t", header=TRUE)

readxl 패키지를 사용하여 xls 및 xlxs 파일 읽기

library("readxl")
my_data <- read_excel("xxxxx.xls")
my_data <- read_excel("xxxxx.xlsx")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.