如何从R中的csv文件中提取不同类型的数据

时间:2015-03-11 13:51:36

标签: r csv import

我有一个csv文件(dropbox link),其中包含由空行/空行分隔的两种类型的信息:

  • 表格4x2,带有实验说明(名称,日期,等等= =仅限字符)
  • 表格10x3,包含样本名称和数据值(字符和数字)

第二个表的标题由3个单独的行/行组成。理想情况下,我只想保留一个,以 ID 开头。

我想以R格式将上述内容导入list

> print(data)

$experiment name
[1] "test1"

$date
[1] "01/01/2015"

$protocol
[1] "test2"

$name
[1] "John Doe"

$data
   ID name value
1  A1   AA   0.1
2  A2   BB  0.16
3  A3   CC  0.12
4  A4   DD  0.45
5  A5   EE  0.35
6  B1   FF   1.2
7  B2   GG  1.12
8  B3   HH  1.05
9  B4   II  1.21
10 B5   JJ  1.18

我已尝试scan csv文件并有条件地导入行,但无济于事。是否有基本函数或一组函数允许我导入用空行分隔的两个表,并从 ID 字符开始有条件地读入第二个表?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

你可以做这样的事情(不完全是你想要的,但这是一个好的开始):

## use readlines since you unstrctred data
ll <- readLines("data.csv")     
list(
     ## I assume that the data is always in 3 first lines
     ## remove extra comma then use read.table   
     settings = read.table(text=gsub(',','',ll[seq(3)]),sep=':'),
     ## find where the data begin using grep
     data= read.table(text=ll[-seq(grep("ID",ll)-1)],header=TRUE,sep=','))

# $settings
#                V1         V2
# 1 experiment name      test1
# 2            date 01/01/2015
# 3        protocol      test2
# 
# $data
#    ID name value
# 1  A1   AA  0.10
# 2  A2   BB  0.16
# 3  A3   CC  0.12
# 4  A4   DD  0.45
# 5  A5   EE  0.35
# 6  B1   FF  1.20
# 7  B2   GG  1.12
# 8  B3   HH  1.05
# 9  B4   II  1.21
# 10 B5   JJ  1.18

答案 1 :(得分:1)

起点是:

data <- list()
all <- read.csv("data.csv", header=F, stringsAsFactors=F)
blank.line <- which(all[[1]]=="")
for (i in 1:(blank.line-1)) data[[all$V1[i]]] <- all$V2[i]
data$data <- read.csv("data.csv", skip=grep("^ID",all[,1])-1, header=T, stringsAsFactors=F)

数据中列表元素的名称与您编写的完全一致 - 如果重要的话,可以使用gsub()冒号来修复这些名称。

根据有关可变长度

的顶级表的评论编辑代码