以特定方式导入数据集R.

时间:2016-11-09 11:41:44

标签: r

我正在尝试导入R中的数据集,如下所示:

segment 1 rank 1 points 10  
11.11111 22.22222    
33.33333 44.44444   
...      ...    
99.99999 99.99999    
segment 2 rank 4 points 40   
12.12345 45.56789
...      ...
98.76543 54.43211

数据集按段分割,所有这些都具有排名和一些值对。对的数量由'点'表示。变量

我尝试了许多不同的导入此数据集的方法,例如使用scan()read.table()read.csv()。我还尝试了许多使用这些导入方法的不同选项,但它们都没有正常工作。

使用read.table()函数,我经常遇到以下错误:

  

第2行没有6个元素

截至目前,我设法通过以下方式导入数据集:

read.table(DF, fill=TRUE)

然而,这样一来,由于填充选项,R中的数据集完全被丢失的值所覆盖,使得使用数据集非常繁琐。

如何以更干净的方式导入数据集?所以我可以消除丢失的字段。 例如:

Segment Rank Points Value1 Value2
1       2    10     11.111 22.222
1       2    10     33.333 44.444
...     ...  ...    ...    ...
22      4    60     88.888 99.999

2 个答案:

答案 0 :(得分:1)

您的任务不仅仅是阅读数据。您正在尝试重新格式化它。 readLines会将数据导入为矢量。您可以从那里对所有内容进行排序。

pull <- function(s) {
  .s <- str_extract(dat[indx], paste0("(?<=",s,").*?\\d+"))
  as.numeric(rep(.s, (rle(grps)$lengths-1)))
}

library(stringr)
dat <- readLines("ex.data")
indx <- grep("segment", dat)
grps <- cumsum(1:length(dat) %in% indx)
labels <- sapply(c("segment", "rank", "points"), pull)
nums <- do.call("rbind", str_split(trimws(dat[-indx]), " "))
data.frame(labels, values=unlist(nums))
#    segment rank points values.1 values.2
# 1        1    1     10 11.11111 22.22222
# 2        1    1     10 33.33333 44.44444
# 3        1    1     10     56.2 49.95662
# 4        1    1     10     46.9 50.00784
# 5        1    2     10     50.7 48.55493
# 6        1    2     10     53.6 48.70022
# 7        1    2     20     42.7 52.51411
# 8        1    2     20     51.5 47.53790
# 9        1    2     20     50.0 50.22578
# 10       2    3     30     50.3 49.68094
# 11       2    3     30     50.4 49.78991
# 12       2    3     30 99.99999 99.99999
# 13       2    5     60 12.12345 45.56789
# 14       2    5     60 98.76543 54.43211

示例数据

cat("segment 1 rank 1 points 10  
11.11111 22.22222    
33.33333 44.44444   
56.2 49.95662
46.9 50.00784
segment 1 rank 2 points 10
50.7 48.55493
53.6 48.70022
segment 1 rank 2 points 20
42.7 52.51411
51.5 47.53790
50.0 50.22578
segment 2 rank 3 points 30
50.3 49.68094
50.4 49.78991 
99.99999 99.99999    
segment 2 rank 5 points 60   
12.12345 45.56789
98.76543 54.43211", file="ex.data")

答案 1 :(得分:0)

试试这个:

read.delim(filename, header=TRUE, sep="\t")