用于阅读CSV部分的翻转方法
情景:您有一个CSV文件,其中包含数据部分,例如
[汽车资料]
MPG,CYL,DISP,马力,DRAT,重量,的QseC,VS,上午,齿轮,碳水化合物
21,6,160,110,3.9,2.62,16.46,0,1,4,4
21,6,160,110,3.9,2.875,17.02,0,1,4,4
22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
18.1,6,225,105,2.76,3.46,20.22,1,0,3,1
14.3,8,360,245,3.21,3.57,15.84,0,0,3,4 ......
[其他的东西]
原谅格式。 我不得不添加额外的新行来使块引用至少与预期的数据格式相似。 我将使用下面的mtcars创建一个可重现的示例,并假装我们已经完成了我们想要的行的子集化操作,例如根据此处引用的激励代码:
# Import raw data:
data_raw <- readLines("test.txt")
# find separation line:
id_sep <- which(data_raw=="")
# create ranges of both data sets:
data_1_range <- 4:(id_sep-1)
data_2_range <- (id_sep+4):length(data_raw)
# using ranges and row data import it:
data_1 <- read.csv(textConnection(data_raw[data_1_range]))
data_2 <- read.csv(textConnection(data_raw[data_2_range]))
从这篇文章。 换句话说,我们所采用的方法是一次读取数据,就像行,找到我们想要的行,然后使用read.csv“读取”它们来获取data.frame。
好吧,今年是2017年,我们希望拥抱整洁的世界,并使用read_lines代替readLines,并使用read_csv代替read.csv。
library(tidyverse)
write_csv(mtcars, "mtcars_local.csv")
# this creates an easily reproduced local file
data_raw <- readLines("mtcars_local.csv")
# henceforth assume we've found the desired rows and subsetted
data_df <- read.csv(textConnection(data_raw))
head(data_df)
mpg cyl disp hp drat wt qsec vs am gear carb
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
# whoo hoo, the above is exactly the output we want (replicating
# the original post answer)
data_raw_2 <- read_lines("mtcars_local.csv")
data_df_2 <- read_csv(textConnection(data_raw_2))
#Error in read_connection_(con) :
# Evaluation error: can only read from a binary connection.
所以read_csv不喜欢像read.csv那样使用textConnection。 read_csv的文档确实会说:
参数:
file: Either a path to a file, a connection, or literal data
(either a single string or a raw vector).
所以,问题:
我们可以创建一个由所需换行符分隔的行的单个数据串:
paste0(data_raw, collapse = "n") [1] "mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carbn21,6,160,110,3.9,2.62,16.46,0,1,4,4n21,6,160,110,...
data_df_2 <- read_csv(paste0(data_raw, collapse = "n"))
head(data_df_2)
# A tibble: 6 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> <int> <int> <int> <int>
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
好吧,等等。 在写这篇文章时,我想出了一个答案。 但使用粘贴似乎klunky。 也许我因阅读胶水包而被宠坏了。 但是有没有一种“整齐”的方式将一段数据从一个CSV文件转换为一个小文件?
链接地址: http://www.djcxy.com/p/30967.html上一篇: tidyverse method for reading CSV section
下一篇: Using multiple color scales in stacked bar plots with ggplot