อ่านไฟล์ Excel โดยตรงจากสคริปต์ R


95

ฉันจะอ่านไฟล์ Excel โดยตรงใน R ได้อย่างไร หรือฉันควรส่งออกข้อมูลเป็นไฟล์ข้อความหรือไฟล์ CSV ก่อนแล้วนำเข้าไฟล์นั้นไปยัง R?


@Sacha Epskamp: ด้วย xlsReadWrite คุณไม่จำเป็นต้องติดตั้ง Perl
Joris Meys

1
gdataเวอร์ชัน 2.8.2 อ่านxlsxไฟล์ด้วยread.xlsฟังก์ชัน
Ben

1
ดูคำเตือนของฉัน (เป็นคำตอบด้านล่าง) เกี่ยวกับการสูญเสียความแม่นยำที่อาจเกิดขึ้นได้หากคุณส่งออกข้อมูลเป็นรูปแบบข้อความจาก Excel
russellpierce

1
xlsxแพคเกจสำหรับ xlsx / xlsm / xls ไม่รู้เกี่ยวกับ xlam เป็นต้น
Qbik

2
"ฉันไม่เคยเห็นเหตุผลที่จะไม่ส่งออกเป็นไฟล์ข้อความก่อน" เกี่ยวกับสิ่งนี้: เมื่อฉันส่งออกเป็น CSV ช่องใดช่องหนึ่งที่ฉันต้องการจะไม่ถูกเขียน ดูเหมือน DRM บางประเภท แต่เนื่องจากฉันไม่ได้เขียนสเปรดชีตฉันจึงไม่รู้
เนตรกก

คำตอบ:


41

ใช่. ดูหน้าเว็บที่เกี่ยวข้องในการวิจัยวิกิพีเดีย คำตอบสั้น ๆ : read.xlsจากgdataแพคเกจใช้งานได้เกือบตลอดเวลา (แม้ว่าคุณจะต้องติดตั้ง Perl ในระบบของคุณซึ่งโดยปกติแล้วจะเป็นจริงบน MacOS และ Linux แต่จะมีขั้นตอนเพิ่มเติมใน Windows เช่นดูที่http://strawberryperl.com/ ). มีคำเตือนและทางเลือกต่างๆที่ระบุไว้ในหน้า R wiki

เหตุผลเดียวที่ฉันไม่เห็นว่าจะทำสิ่งนี้โดยตรงก็คือคุณอาจต้องการตรวจสอบสเปรดชีตเพื่อดูว่ามีข้อบกพร่องหรือไม่ (ส่วนหัวแปลก ๆ แผ่นงานหลายแผ่น [คุณอ่านได้ครั้งละหนึ่งแผ่นเท่านั้นแม้ว่าคุณจะสามารถวนซ้ำได้ทั้งหมด] แปลงรวม ฯลฯ ) แต่สำหรับสเปรดชีตสี่เหลี่ยมที่มีรูปทรงดีพร้อมตัวเลขธรรมดาและข้อมูลอักขระ (เช่นไม่ใช่ตัวเลขที่จัดรูปแบบด้วยจุลภาควันที่สูตรที่มีข้อผิดพลาดหารด้วยศูนย์ค่าที่ขาดหายไป ฯลฯ ... ) โดยทั่วไปฉันไม่มีปัญหา ด้วยกระบวนการนี้


6
มีปัญหาที่อาจเกิดขึ้นมากมายที่ฉันต้องพิจารณาเป็นการส่วนตัว ช่องที่มีตัวเลขที่มีเครื่องหมายจุลภาคต้องถูกขีดฆ่าและแปลงเป็นตัวเลขใน R ช่องที่มี "-" จะต้องถูกเข้ารหัสเป็น NA คำแนะนำโดยรวมคือการดูตัวเลขของคุณใน Excel จริงๆและตรวจสอบให้แน่ใจว่ามีการแปลอย่างถูกต้องเป็น R.
Brandon Bertelsen

3
ไม่สามารถโต้แย้งกับ "คุณต้องดูตัวเลขของคุณจริงๆ" ... อะไรคือปัญหาของช่อง "-"? ไม่na.strings="-"แก้ไขปัญหาได้หรือไม่? ปัญหาเหล่านี้เป็นปัญหาทั่วไปกี่ข้อและจำนวนของปัญหาเหล่านี้ (เช่นช่องตัวเลขที่มีเครื่องหมายจุลภาค) สามารถแก้ไขได้ด้วยเครื่องมืออื่น ๆ เช่น XLConnect ... ?
Ben Bolker

1
ความคิดเห็นนั้นส่งไปที่ OP ไม่ใช่ที่คุณ Ben ความผิดของฉันที่จัดตำแหน่งไม่ดี
Brandon Bertelsen

1
เกร็ดเล็กเกร็ดน้อยที่เกี่ยวข้อง: read.xlsประสบความสำเร็จในการอ่านแผ่นงานขนาดใหญ่มากจากไฟล์ Excel โดยที่ทั้งคู่XLConnectและxlsxล้มเหลว (ฉันเชื่อว่าเพราะทั้งคู่พึ่งพาApache POI )
Matt Parker

49

ผมขอย้ำว่าสิ่งที่ @Chase แนะนำ: ใช้XLConnect

เหตุผลในการใช้ XLConnect คือในความคิดของฉัน:

  1. ข้ามแพลตฟอร์ม XLConnect เขียนด้วย Java ดังนั้นจะทำงานบน Win, Linux, Mac โดยไม่มีการเปลี่ยนแปลงรหัส R ของคุณ (ยกเว้นสตริงพา ธ )
  2. ไม่มีอะไรให้โหลดอีกแล้ว เพียงแค่ติดตั้ง XLConnect และใช้ชีวิตต่อไป
  3. คุณพูดถึงการอ่านไฟล์ Excel เท่านั้น แต่ XLConnect จะเขียนไฟล์ Excel ด้วยรวมถึงการเปลี่ยนการจัดรูปแบบเซลล์ และจะทำจาก Linux หรือ Mac ไม่ใช่แค่ Win

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แพ็คเกจซึ่งต้องใช้ Rtools (สำหรับ Windows) หรือ Xcode (สำหรับ OSX) ซึ่งเป็นการอ้างอิงภายนอกของ R แม้ว่าจะมีหลายคนติดตั้งด้วยเหตุผลอื่นก็ตาม .


3
เร็วกว่า xlsx มาก เวลาอ่านจะเหมือนกับ read.xlsx2 แต่อนุมานประเภท
Steve Rowe

1
@SteveRowe ดูคำตอบใหม่สำหรับเกณฑ์มาตรฐานวัตถุประสงค์บางอย่าง (พยายาม) ยืนยันสิ่งนี้
MichaelChirico

มีวิธีอ่านสตริงเป็นตัวประกอบread_excelหรือไม่? ฉันชอบความเร็วเมื่อเทียบกับread.xlsxแต่การแปลงคอลัมน์จากอักขระเป็นตัวประกอบด้วยตนเองจะทำให้จุดประสงค์ไม่ได้
coip

2
+1 สำหรับข้อเท็จจริงที่ว่าไม่มีการอ้างอิง ฉันเกลียดที่จะต้องติดตั้ง java และฉันได้ลองใช้แล้วและได้ผลดีสำหรับฉัน
Bastian

2
readxl และ openxlsx ดีที่สุด readxl เร็วกว่า แต่ไม่อนุญาตให้เขียน อย่างไรก็ตามไม่มีสิ่งใดที่ทำงานได้ดีเมื่อพยายามระบุคลาส / ประเภทคอลัมน์
กัน

29

แก้ไข 2015- ตุลาคม:ตามที่คนอื่นแสดงความคิดเห็นไว้ที่นี่openxlsxและreadxlแพ็กเกจนั้นเร็วกว่าxlsxแพ็คเกจมากและจัดการเปิดไฟล์ Excel ขนาดใหญ่ได้ (> 1500 แถว &> 120 คอลัมน์) @MichaelChirico แสดงให้เห็นว่าreadxlดีกว่าเมื่อต้องการความเร็วและopenxlsxแทนที่ฟังก์ชันที่มีให้ในxlsxแพ็คเกจ หากคุณกำลังมองหาแพ็กเกจเพื่ออ่านเขียนและแก้ไขไฟล์ Excel ในปี 2015 ให้เลือกopenxlsxแทนxlsxไฟล์.

: Pre-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)))

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)
)

จากนั้นผมก็เขียนนี้เป็น CSV และเปิดใน LibreOffice และบันทึกเป็นไฟล์ .xlsx แล้ว benchmarked 4 แพคเกจที่กล่าวถึงในกระทู้นี้: xlsx, openxlsx, readxlและgdataใช้ตัวเลือกเริ่มต้น (ฉันยังพยายามรุ่นของหรือไม่ว่าฉัน ระบุประเภทคอลัมน์ แต่ไม่ได้เปลี่ยนการจัดอันดับ)

ฉันไม่รวมRODBCเพราะฉันใช้ลินุกซ์ XLConnectเนื่องจากดูเหมือนว่าจุดประสงค์หลักไม่ได้อ่านในแผ่นงาน Excel แผ่นเดียว แต่นำเข้าสมุดงาน Excel ทั้งหมดดังนั้นการที่จะนำม้าเข้ามาแข่งขันกับความสามารถในการอ่านเท่านั้นดูเหมือนจะไม่ยุติธรรม และxlsReadWriteเนื่องจากไม่สามารถใช้งานร่วมกับเวอร์ชันของฉันได้อีกต่อไปR(ดูเหมือนว่าจะถูกยกเลิกไปแล้ว)

จากนั้นฉันก็รันการวัดประสิทธิภาพด้วยNN=1000LและNN=25000L(รีเซ็ตเมล็ดพันธุ์ก่อนการประกาศdata.frameข้างต้นแต่ละครั้ง) เพื่อให้มีความแตกต่างเกี่ยวกับขนาดไฟล์ Excel gcเป็นหลักxlsxซึ่งฉันพบว่าบางครั้งอาจทำให้หน่วยความจำอุดตัน โดยไม่ต้องกังวลใจต่อไปนี้คือผลลัพธ์ที่ฉันพบ:

ไฟล์ Excel 1,000 แถว

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ช้ากว่า

ไฟล์ Excel 25,000 แถว

เนื่องจากระยะเวลาที่ใช้ฉันทำซ้ำเพียง 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เป็นผู้ชนะที่ชัดเจนในเรื่องความเร็ว gdataดีกว่ามีอย่างอื่นให้ทำเนื่องจากการอ่านไฟล์ Excel ช้าลงอย่างเจ็บปวดและปัญหานี้รุนแรงขึ้นสำหรับตารางขนาดใหญ่เท่านั้น

การดึงสองครั้งopenxlsxคือ 1) วิธีการอื่น ๆ ที่กว้างขวาง ( readxlออกแบบมาเพื่อทำเพียงสิ่งเดียวซึ่งอาจเป็นส่วนหนึ่งของสาเหตุที่มันเร็วมาก) โดยเฉพาะอย่างยิ่งการwrite.xlsxทำงานของมันและ 2) (ข้อเสียเปรียบสำหรับreadxl) col_typesอาร์กิวเมนต์ในreadxlเท่านั้น (as ที่เขียนนี้) ยอมรับมาตรฐานบางR: "text"แทน"character"และแทน"date""Date"


จะเป็นการดีมากหากคุณเพิ่มเกณฑ์มาตรฐานสำหรับ XLConnect ด้วย แสดงความคิดเห็นด้วยว่า readxl มันเขียนไม่ได้ xlsx และ openxlsx ทำงานไม่ถูกต้องกับตัวเลือก col_types หรือ colClasses
58

@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 ไม่มีเวลาเซ็กซี่สำหรับฉันและ ODBC บน 64 บิต W7 ...
Roman Luštrik

4
กำลังโหลดแพ็คเกจที่จำเป็น: ข้อผิดพลาด RODBC ใน odbcConnectExcel (file.name): odbcConnectExcel สามารถใช้ได้กับ Windows 32 บิตเท่านั้น
andrekos


6

อีกวิธีหนึ่งคือxlsReadWriteแพ็คเกจซึ่งไม่ต้องการการติดตั้งเพิ่มเติม แต่คุณต้องดาวน์โหลด shlib เพิ่มเติมก่อนที่จะใช้งานครั้งแรกโดย:

require(xlsReadWrite)
xls.getshlib()

การลืมสิ่งนี้อาจทำให้เกิดความหงุดหงิดอย่างที่สุด เคยไปมาแล้วและ ...

ในด้านข้าง: คุณอาจต้องการพิจารณาแปลงเป็นรูปแบบข้อความ (เช่น csv) และอ่านจากที่นั่น ด้วยเหตุผลหลายประการ:

  • ไม่ว่าโซลูชันของคุณจะเป็นแบบใด (RODBC, gdata, xlsReadWrite) สิ่งแปลก ๆ บางอย่างอาจเกิดขึ้นได้เมื่อข้อมูลของคุณถูกแปลง โดยเฉพาะวันที่อาจจะค่อนข้างยุ่งยาก HFWutilsแพคเกจมีเครื่องมือบางอย่างเพื่อจัดการกับวันที่ Excel (ต่อความคิดเห็น @ Ben Bolker ของ)

  • หากคุณมีแผ่นงานขนาดใหญ่การอ่านในไฟล์ข้อความจะเร็วกว่าการอ่านจาก EXCEL

  • สำหรับไฟล์. xls และ. xlsx อาจจำเป็นต้องใช้โซลูชันที่แตกต่างกัน เช่นแพ็คเกจ xlsReadWrite ไม่รองรับ. xlsx AFAIK gdataต้องการให้คุณติดตั้ง perl libraries เพิ่มเติมสำหรับการรองรับ. xlsx xlsxแพ็คเกจสามารถรองรับนามสกุลที่มีชื่อเดียวกันได้


@ Ben Thx สำหรับเคล็ดลับฉันจะรวมไว้ในคำตอบของฉัน ฉันไม่ได้พยายามทำให้สมบูรณ์เนื่องจากหน้าวิกิลิงก์คำตอบที่ยอมรับนั้นค่อนข้างสมบูรณ์แล้ว แต่ไม่ได้กล่าวถึงแพ็คเกจ HFWutils
Joris Meys

1
-1; ดูคำตอบของฉัน TL: DR: Excel ไม่บันทึกชุดข้อมูลที่มีความแม่นยำเต็มไปยัง csv (หรือคลิปบอร์ด) เฉพาะค่าที่มองเห็นได้เท่านั้นที่จะคงอยู่
russellpierce

5

ดังที่ระบุไว้ข้างต้นในคำตอบอื่น ๆ มีแพ็คเกจที่ดีมากมายที่เชื่อมต่อกับไฟล์ XLS / X และรับข้อมูลด้วยวิธีที่สมเหตุสมผล อย่างไรก็ตามคุณควรได้รับคำเตือนว่าไม่ควรใช้ไฟล์คลิปบอร์ด (หรือไฟล์. csv) เพื่อดึงข้อมูลจาก Excel หากต้องการดูสาเหตุให้เข้า=1/3สู่เซลล์ใน excel ตอนนี้ลดจำนวนจุดทศนิยมที่คุณมองเห็นให้เหลือสองจุด จากนั้นคัดลอกและวางข้อมูลลงใน R ตอนนี้บันทึก CSV คุณจะสังเกตเห็นในทั้งสองกรณี Excel เก็บเฉพาะข้อมูลที่ปรากฏให้คุณเห็นผ่านอินเทอร์เฟซเท่านั้นและคุณได้สูญเสียความแม่นยำทั้งหมดในแหล่งข้อมูลจริงของคุณ


1
ฉันอยากรู้ว่าใครคิดว่าความเที่ยงตรงของตัวเลขไม่เกี่ยวข้อง / สำคัญ
russellpierce

1
คำเตือนที่ดี ทั้งนี้ขึ้นอยู่กับแพ็คเกจที่คุณใช้ บางคนไม่ได้ตกหลุมพรางนี้
RockScience

@RocketScience นี่คือตัวเลือกการออกแบบพื้นฐานในการส่งออก CSV โดย Excel คุณมีตัวอย่างแพ็คเกจที่ใช้คลิปบอร์ดที่ไม่มีปัญหานี้หรือไม่? แพ็กเกจที่แยกวิเคราะห์ไฟล์ xls xlsx โดยตรงจะมีแนวโน้มที่จะไม่ตกอยู่ในกับดักนี้ ดังนั้นขอบเขตเฉพาะของคำเตือนของฉัน
russellpierce

บน Unix gnumeric::read.gnumeric.sheetคุณสามารถลอง บน Windows ฉันไม่แน่ใจ 100% แต่ฉันคิดว่าgdata::read.xlsควรจะทำงานได้ดีเช่นกัน (จำเป็นต้องติดตั้ง perl)
RockScience

@RockScience ด้วยความเคารพ gdata :: read.xls ไม่ทำงานกับข้อมูลคลิปบอร์ด (เว้นแต่คุณจะออกนอกเส้นทาง) และตัวเลขไม่ใช่ 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ใช้characterในreadColumnsฟังก์ชันเพื่อระบุปัจจัย ผมมั่นใจว่ามีวิธีที่สง่างามมากขึ้นในการได้รับปัจจัยเป็นตัวละคร 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)

การอ่านไฟล์ xls และ xlxs โดยใช้แพ็คเกจ readxl

library("readxl")
my_data <- read_excel("xxxxx.xls")
my_data <- read_excel("xxxxx.xlsx")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.