คำถามนี้มีอายุหลายปีแล้ว แต่ฉันก็สะดุดกับคำถามนี้ซึ่งหมายความว่าคนอื่นอาจจะ
readr
ห้องสมุด / แพคเกจที่มีคุณสมบัติที่ดีบางอย่างกับมัน หนึ่งในนั้นเป็นวิธีที่ดีในการตีความคอลัมน์ "ยุ่ง" เช่นนี้
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
สิ่งนี้ให้ผลตอบแทน
ที่มา: local data frame [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
จุดสำคัญเมื่อมีการอ่านในรูปแบบไฟล์: คุณอาจจะต้องดำเนินการก่อนเช่นความคิดเห็นข้างต้นเกี่ยวกับsed
หรือคุณมีที่จะดำเนินการในขณะที่การอ่าน บ่อยครั้งหากคุณพยายามแก้ไขสิ่งต่างๆตามความเป็นจริงมีข้อสันนิษฐานที่เป็นอันตรายบางอย่างที่หาได้ยาก (ซึ่งเป็นเหตุผลว่าทำไมไฟล์แบนจึงชั่วร้ายในตอนแรก)
ตัวอย่างเช่นหากฉันไม่ได้ตั้งค่าสถานะcol_types
ฉันจะได้รับสิ่งนี้:
> read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5")
Source: local data frame [4 x 1]
numbers
(chr)
1 800
2 1,800
3 3500
4 6.5
(สังเกตว่าตอนนี้เป็นchr
( character
) แทนที่จะเป็น a numeric
)
หรืออันตรายกว่านั้นถ้ามันยาวพอและองค์ประกอบแรก ๆ ส่วนใหญ่ไม่มีเครื่องหมายจุลภาค:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(ดังนั้นองค์ประกอบบางส่วนสุดท้ายดูเหมือน :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
แล้วคุณจะพบปัญหาในการอ่านลูกน้ำนั้นเลย!
> tail(read_csv(tmp))
Source: local data frame [6 x 1]
3"
(dbl)
1 8.000
2 5.000
3 5.000
4 9.000
5 7.000
6 1.003
Warning message:
1 problems parsing literal data. See problems(...) for more details.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
)