การระบุ colClasses ใน read.csv


108

ฉันพยายามระบุcolClassesตัวเลือกในread.csvฟังก์ชันใน R ในข้อมูลของฉันคอลัมน์แรก "เวลา" เป็นเวกเตอร์อักขระในขณะที่คอลัมน์ที่เหลือเป็นตัวเลข

data <- read.csv("test.csv", comment.char="" , 
                 colClasses=c(time="character", "numeric"), 
                 strip.white=FALSE)

ในคำสั่งด้านบนฉันต้องการให้ R อ่านในคอลัมน์ "เวลา" เป็น "อักขระ" และส่วนที่เหลือเป็นตัวเลข แม้ว่าตัวแปร "data" จะมีผลลัพธ์ที่ถูกต้องหลังจากที่คำสั่งเสร็จสมบูรณ์ R ส่งคืนคำเตือนต่อไปนี้ ฉันสงสัยว่าฉันจะแก้ไขคำเตือนเหล่านี้ได้อย่างไร?

Warning messages:
 1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
    not all columns named in 'colClasses' exist
 2: In tmp[i[i > 0L]] <- colClasses :
    number of items to replace is not a multiple of replacement length

เดเร็ค

คำตอบ:


78

เวกเตอร์ colClasses ต้องมีความยาวเท่ากับจำนวนคอลัมน์ที่นำเข้า สมมติว่าคอลัมน์ชุดข้อมูลที่เหลือคือ 5:

colClasses=c("character",rep("numeric",5))

7
คุณอาจใช้สิ่งต่อไปนี้เพื่ออ่านบรรทัดแรกของ csv และกำหนดจำนวนคอลัมน์ scan (csv, sep = ',', what = "character", nlines = 1)
defoo

34
นี่เป็นคำตอบที่ไม่ถูกต้องและทำให้ฉันผิดหวังสักพัก คำตอบที่ถูกต้องอยู่ด้านล่าง ไม่ได้พยายามที่จะเป็นคนขี้เหวี่ยงแค่อยากให้แน่ใจว่ามันจะไม่เกิดขึ้นกับคนอื่น
Rob

3
@ Rob ในกรณีของฉันนี้ยังคงเป็นคำตอบที่ถูกต้องเมื่อคุณยังต้องระบุชั้นเรียนของตัวแปรอื่น ๆ read.tableและพวกเขาจะไม่ได้รับการยอมรับโดยอัตโนมัติเช่นนี้โดย
tchakravarty

173

คุณสามารถระบุ colClasse สำหรับคอลัมน์เดียวเท่านั้น

ดังนั้นในตัวอย่างของคุณคุณควรใช้:

data <- read.csv('test.csv', colClasses=c("time"="character"))

21
ไม่ใช่ว่าจะสำคัญมาก แต่ฉันพบว่าสิ่งนี้ใช้งานได้โดยไม่ต้องอ้างชื่อคอลัมน์
Hendy

วิธีนี้มีประโยชน์มากเมื่อพยายามอ่านจำนวนเต็มที่ยกมาเป็นอักขระ ขอบคุณ!
nils-holmberg

14

สมมติว่าคอลัมน์ 'เวลา' ของคุณมีการสังเกตอย่างน้อยหนึ่งรายการที่มีอักขระที่ไม่ใช่ตัวเลขและคอลัมน์อื่น ๆ ทั้งหมดของคุณมีเพียงตัวเลขจากนั้นค่าเริ่มต้นของ 'read.csv จะอ่านเป็น' เวลา 'เป็น' ตัวประกอบ 'และส่วนที่เหลือทั้งหมดของ คอลัมน์เป็น 'ตัวเลข' ดังนั้นการตั้งค่า 'stringsAsFactors = F' จะได้ผลลัพธ์เช่นเดียวกับการตั้งค่า 'colClasses' ด้วยตนเองนั่นคือ

data <- read.csv('test.csv', stringsAsFactors=F)

10

หากคุณต้องการอ้างถึงชื่อจากส่วนหัวแทนที่จะเป็นหมายเลขคอลัมน์คุณสามารถใช้สิ่งนี้:

fname <- "test.csv"
headset <- read.csv(fname, header = TRUE, nrows = 10)
classes <- sapply(headset, class)
classes[names(classes) %in% c("time")] <- "character"
dataset <- read.csv(fname, header = TRUE, colClasses = classes)

4

สำหรับคอลัมน์วันที่และเวลาหลายคอลัมน์ที่ไม่มีส่วนหัวและมีคอลัมน์จำนวนมากให้บอกว่าฟิลด์วันที่และเวลาของฉันอยู่ในคอลัมน์ 36 และ 38 และฉันต้องการให้อ่านเป็นฟิลด์อักขระ:

data<-read.csv("test.csv", head=FALSE,   colClasses=c("V36"="character","V38"="character"))                        

3

ฉันรู้ว่า OP ถามเกี่ยวกับutils::read.csvฟังก์ชั่นนี้ แต่ให้ฉันตอบสำหรับสิ่งเหล่านี้ที่มาที่นี่เพื่อค้นหาวิธีการใช้งานreadr::read_csvจาก tidyverse

read_csv ("test.csv", col_names=FALSE, col_types = cols (.default = "c", time = "i"))

ควรตั้งค่าประเภทเริ่มต้นสำหรับคอลัมน์ทั้งหมดเป็นอักขระในขณะที่เวลาจะถูกแยกวิเคราะห์เป็นจำนวนเต็ม


0

ถ้าเรารวมสิ่งที่ @Hendy และ @Oddysseus Ithaca มีส่วนทำให้เราสะอาดขึ้นและมีส่วนร่วมมากขึ้น (เช่นปรับเปลี่ยนได้?)

    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.