我正在尝试导入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
答案 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")