R中如何在同一个excelsheet中导入两组数据?
How to import two sets of data in the same excel sheet in R?
目前在一个 excel sheet 我有一个数据块,从第 1 行开始,最后一行总是变化,但通常在 18 或 19 左右。一旦第一组data ends然后有两个空白行,第二个数据集开始,也是18或19左右。两个数据集的列数相同,共享相同的headers。我将 excel sheet 保存为 csv。然后在 R 中我会做 read.csv()
,但是在我做完之后我不知道如何将两组数据分开成单独的 data.frames。
我意识到我可以将第二个数据集复制并粘贴到单独的 excel sheet 中并读入,但我不想那样做。我想保持 excel sheet 不变。
excelsheet的例子:
A B C D # FIRST DATA SET
1 2 3 4
A B C D # SECOND DATA SET
5 6 7 8
我们将不胜感激,如果需要更多信息,请告诉我。
这取决于。如果你知道第一个块结束的行号而第二个没有header,你可以做
mydata <- read.csv('yourfile.csv', header=TRUE)
block1 <- mydata[1:18,]
block2 <- mydata[19:nrow(mydata)]
如果你的块有不同的结构,比如不同的列数,每个块都有自己的列名,那么最好使用readLines()函数,并将结果传递给read.csv。你怎么区分这些积木?
回复您的评论:
然后就相对容易了。正如 Kota Mori 指出的那样,用空白点赞阅读你的数据。假设您的第一列有数值,并且除了数据集之间没有 NA,
mydata <- read.table('yourfile.csv', header=TRUE, blank.lines.skip = FALSE)
blines <- which(is.na(mydata[,1]))
data1 <- mydata[1:(blines[1]-1),]
data2 <- mydata[(blines[length(blines)]+1):nrow(mydata),]
您应该根据您的数据更改搜索模式。
这取决于你有什么数据文件。
如果两个数据之间有两个空行,让 blank.lines.skip = FALSE
在 read.csv()
中可以让您找到拆分数据的位置。
可能有很多方法可以实现您想要的。也许只是使用 readLines
阅读它,然后确定两个空行的索引并在两个子集上使用 read.csv
:
txt <- readLines(con=textConnection("1,2,3,4
5,6,7,8
a,b,c,d,e
f,g,h,i,j"))
read.csv(header=F, text=txt[1:which.max(txt=="")])
# V1 V2 V3 V4
# 1 1 2 3 4
# 2 5 6 7 8
read.csv(header=F, text=txt[(which.max(txt=="")+2):length(txt)])
# V1 V2 V3 V4 V5
# 1 a b c d e
# 2 f g h i j
关于您添加的玩具示例:
txt <- readLines(con=textConnection("A B C D #1st
1 2 3 4
A B C D #2nd
5 6 7 8"))
txt <- sub("\s+#.*$", "", txt) # delete comments if necessary
read.table(header=T, check.names = F, text=txt[1:which.max(txt=="")])
# A B C D
# 1 1 2 3 4
read.table(header=T, check.names = F, text=txt[(which.max(txt=="")+2):length(txt)])
# A B C D
# 1 5 6 7 8
目前在一个 excel sheet 我有一个数据块,从第 1 行开始,最后一行总是变化,但通常在 18 或 19 左右。一旦第一组data ends然后有两个空白行,第二个数据集开始,也是18或19左右。两个数据集的列数相同,共享相同的headers。我将 excel sheet 保存为 csv。然后在 R 中我会做 read.csv()
,但是在我做完之后我不知道如何将两组数据分开成单独的 data.frames。
我意识到我可以将第二个数据集复制并粘贴到单独的 excel sheet 中并读入,但我不想那样做。我想保持 excel sheet 不变。
excelsheet的例子:
A B C D # FIRST DATA SET
1 2 3 4
A B C D # SECOND DATA SET
5 6 7 8
我们将不胜感激,如果需要更多信息,请告诉我。
这取决于。如果你知道第一个块结束的行号而第二个没有header,你可以做
mydata <- read.csv('yourfile.csv', header=TRUE)
block1 <- mydata[1:18,]
block2 <- mydata[19:nrow(mydata)]
如果你的块有不同的结构,比如不同的列数,每个块都有自己的列名,那么最好使用readLines()函数,并将结果传递给read.csv。你怎么区分这些积木?
回复您的评论: 然后就相对容易了。正如 Kota Mori 指出的那样,用空白点赞阅读你的数据。假设您的第一列有数值,并且除了数据集之间没有 NA,
mydata <- read.table('yourfile.csv', header=TRUE, blank.lines.skip = FALSE)
blines <- which(is.na(mydata[,1]))
data1 <- mydata[1:(blines[1]-1),]
data2 <- mydata[(blines[length(blines)]+1):nrow(mydata),]
您应该根据您的数据更改搜索模式。
这取决于你有什么数据文件。
如果两个数据之间有两个空行,让 blank.lines.skip = FALSE
在 read.csv()
中可以让您找到拆分数据的位置。
可能有很多方法可以实现您想要的。也许只是使用 readLines
阅读它,然后确定两个空行的索引并在两个子集上使用 read.csv
:
txt <- readLines(con=textConnection("1,2,3,4
5,6,7,8
a,b,c,d,e
f,g,h,i,j"))
read.csv(header=F, text=txt[1:which.max(txt=="")])
# V1 V2 V3 V4
# 1 1 2 3 4
# 2 5 6 7 8
read.csv(header=F, text=txt[(which.max(txt=="")+2):length(txt)])
# V1 V2 V3 V4 V5
# 1 a b c d e
# 2 f g h i j
关于您添加的玩具示例:
txt <- readLines(con=textConnection("A B C D #1st
1 2 3 4
A B C D #2nd
5 6 7 8"))
txt <- sub("\s+#.*$", "", txt) # delete comments if necessary
read.table(header=T, check.names = F, text=txt[1:which.max(txt=="")])
# A B C D
# 1 1 2 3 4
read.table(header=T, check.names = F, text=txt[(which.max(txt=="")+2):length(txt)])
# A B C D
# 1 5 6 7 8