Excel 파일을 R로 직접 읽는 방법은 무엇입니까? 아니면 먼저 데이터를 텍스트 또는 CSV 파일로 내보내고 해당 파일을 R로 가져와야합니까?
gdata버전 2.8.2 xlsx는 read.xls함수로 파일을 읽습니다
xlsxxlsx / xlsm / xls 용 패키지, xlam 등에 대해 모릅니다.
Excel 파일을 R로 직접 읽는 방법은 무엇입니까? 아니면 먼저 데이터를 텍스트 또는 CSV 파일로 내보내고 해당 파일을 R로 가져와야합니까?
gdata버전 2.8.2 xlsx는 read.xls함수로 파일을 읽습니다
xlsxxlsx / xlsm / xls 용 패키지, xlam 등에 대해 모릅니다.
답변:
예. R wiki의 관련 페이지를 참조하십시오 . 짧은 대답 : 패키지 read.xls에서 gdata대부분의 경우 작동합니다 (시스템에 Perl을 설치해야하지만 일반적으로 MacOS 및 Linux에서는 이미 적용되지만 Windows에서는 추가 단계가 필요합니다. http://strawberryperl.com/ 참조) ). R wiki 페이지에는 다양한주의 사항과 대안이 있습니다.
이 작업을 직접 수행하지 않는 유일한 이유는 스프레드 시트에 결함 (이상한 머리글, 여러 워크 시트)이 있는지 확인하기 위해 스프레드 시트를 검사 할 수 있기 때문입니다 (분명히 모든 항목을 반복 할 수 있지만 한 번에 하나씩 만 읽을 수 있음). , 포함 된 플롯 등). 그러나 평범한 숫자와 문자 데이터 (즉, 쉼표 형식의 숫자, 날짜, 0으로 나누기 오류가있는 수식, 결 측값 등이 아닌)가있는 잘 구성된 직사각형 스프레드 시트의 경우 일반적으로 문제가 없습니다. 이 과정에서.
na.strings="-"문제를 해결? 이러한 문제 중 일반적인 문제는 몇 개이며 XLConnect ...와 같은 다른 도구로 해결할 수있는 문제 (예 : 쉼표가있는 숫자 필드)는 얼마나됩니까?
@Chase 권장 사항을 다시 반복하겠습니다 . XLConnect를 사용하십시오 .
XLConnect를 사용하는 이유는 다음과 같습니다.
XLConnect는 다른 솔루션에 비해 다소 새롭기 때문에 블로그 게시물 및 참조 문서에서 자주 언급되지 않습니다. 저에게는 매우 유용했습니다.
그리고 이제 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. 비록 외부 종속성을 .
read_excel있습니까? 에 비해 속도가 마음에 read.xlsx들지만 열을 문자에서 요소로 수동으로 변환해야하는 것은 목적에 맞지 않습니다.
EDIT 2015 년 10 월 : 다른 사람이 여기에 댓글을 달았 것처럼 openxlsx및 readxl패키지는 훨씬 빠르게보다가있는 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사양은 열을 요인으로 변환합니다. 시간에 대한 사용 Date및 POSIXct옵션.
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)))
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=1000L및 NN=25000L( data.frame위 의 각 선언 전에 시드 재설정) 벤치 마크를 실행 하여 Excel 파일 크기와 관련된 차이점을 허용했습니다. gc주로를위한 xlsx것으로, 때때로 메모리 막힘을 일으킬 수 있음을 발견했습니다. 더 이상 고민하지 않고 찾은 결과는 다음과 같습니다.
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.
시간이 많이 걸리기 때문에 더 큰 파일에서 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나는 정기적으로 유형을 지정하는 데 모두 사용 등을.
나는 행운을 빕니다 XLConnect: http://cran.r-project.org/web/packages/XLConnect/index.html
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를 좋아하고 추천 할 수 있습니다.
openxlsx오늘 패키지 를 사용해 보았습니다. 정말 잘 (그리고 빠르게) 작동했습니다.
또 다른 해결책은 xlsReadWrite추가 설치가 필요하지 않지만 처음 사용하기 전에 추가 shlib를 다운로드해야하는 패키지입니다.
require(xlsReadWrite)
xls.getshlib()
이것을 잊어 버리면 완전히 좌절 할 수 있습니다. 거기에 모든 것 ...
참고 : 텍스트 기반 형식 (예 : csv)으로 변환하고 거기에서 읽어 보는 것이 좋습니다. 여러 가지 이유가 있습니다.
솔루션 (RODBC, gdata, xlsReadWrite)이 무엇이든 데이터가 변환 될 때 이상한 일이 발생할 수 있습니다. 특히 날짜는 다소 번거로울 수 있습니다. HFWutils패키지 (@ 벤 Bolker의 코멘트 당) EXCEL 날짜를 다루는 몇 가지 도구가 있습니다.
큰 시트가있는 경우 텍스트 파일을 읽는 것이 EXCEL에서 읽는 것보다 빠릅니다.
.xls 및 .xlsx 파일의 경우 다른 솔루션이 필요할 수 있습니다. 예를 들어 xlsReadWrite 패키지는 현재 .xlsx AFAIK를 지원하지 않습니다. gdata.xlsx 지원을 위해 추가 perl 라이브러리를 설치해야합니다. xlsx패키지는 동일한 이름의 확장을 처리 할 수 있습니다.
다른 많은 답변에서 위에서 언급했듯이 XLS / X 파일에 연결하고 합리적인 방법으로 데이터를 가져 오는 좋은 패키지가 많이 있습니다. 그러나 어떤 상황에서도 클립 보드 (또는 .csv) 파일을 사용하여 Excel에서 데이터를 검색해서는 안된다는 경고를 받아야합니다. 이유를 확인하려면 =1/3Excel에서 셀에 입력하십시오 . 이제 눈에 보이는 소수점 수를 2로 줄이십시오. 그런 다음 데이터를 복사하여 R에 붙여 넣습니다. 이제 CSV를 저장합니다. 두 경우 모두 Excel이 인터페이스를 통해 표시되는 데이터 만 유지하고 실제 원본 데이터의 모든 정밀도를 잃어버린 것을 알 수 있습니다.
gnumeric::read.gnumeric.sheet. Windows에서 나는 100 % 확신하지만 난 생각 gdata::read.xls도 잘 작동한다 (필요 펄하지만 설치)
@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)))
numeric을 위해 factors내 컴퓨터에 설치합니다. read.xlsx용도 character의 readColumns기능 요소를 지정합니다. 요소를 문자로 가져 오는 더 우아한 방법이 있다고 확신하지만 다음은 작동하는 함수의 수정 된 버전입니다 df.real <- read.xlsx2("filename.xlsx", 1, colClasses=gsub("factor", "character", as.vector(sapply(df.temp, class)))).
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")