我想请求一个脚本来检测并合并(见下文)r中的标题行,当有多行标题时,如示例所示。普遍的答案应该是:
一标识标题行数(2到更多)
2填充页眉间隙(请参见示例中的NAs)
三。将所有标题行合并为一行。
我只能手动操作,如下所示可能这对于任何行数的标题都是可能的。
text1<-"NA h_row1a NA NA NA h_row1b NA NA NA
NA h_row2a NA h_row2b NA h_row2c NA h_row2d NA
NA h_row3a h_row3b h_row3c h_row3d h_row3e h_row3f h_row3g h_row3h
element1 2 24% 25 40 23 44% 76 34
element2 3 26% 40 86 233 12% 55 12"
table1<-read.table(text=text1, skip=3,header=FALSE)
cat(text1, file = "ex.data")
header<-scan("ex.data", nlines = 1, what = character(), sep="", na.strings = "NA")
library(zoo)
header<-na.locf(header, na.rm=FALSE) # this fills the header gaps
header2 <- scan("ex.data", skip = 1, nlines = 1, what = character(), sep="", na.strings = "NA")
header2<-na.locf(header2, na.rm=FALSE)
header3 <- scan("ex.data", skip = 2, nlines = 1, what = character(), sep="", na.strings = "NA")
names(table1) <- paste0(header, header2, header3)
table1
# NANANA h_row1ah_row2ah_row3a h_row1ah_row2ah_row3b h_row1ah_row2bh_row3c h_row1ah_row2bh_row3d h_row1bh_row2ch_row3e h_row1bh_row2ch_row3f, etc.
#1 element1 2 24% 25 40 23 44%, etc.
#2 element2 3 26% , etc.
最佳答案
你可以这样做。它使用rle
来查看有多少行不能强制为numeric
,并假设这些是头我还将第一列设置为rownames—不确定您是否需要它。您可能还希望在完成此过程后将剩余值转换为numeric
-此时它们仍然character
。
tab <- read.table(text=text1, header=FALSE,stringsAsFactors = FALSE)
#estimate no of header rows
headrows <- rle(apply(tab,1,function(x)(any(!is.na(as.numeric(x))))))$lengths[1]
#fill in blanks in headers
tab[1:headrows,] <- t(apply(tab[1:headrows,],1,na.locf,na.rm=FALSE))
names(tab) <- apply(tab[1:headrows,],2,paste0,collapse="_")
tab <- tab[-c(1:headrows),] #remove header rows (now set as column names)
rownames(tab) <- tab[,1]
tab <- tab[,-1] #remove first column (now set as rownames)
tab
h_row1a_h_row2a_h_row3a h_row1a_h_row2a_h_row3b h_row1a_h_row2b_h_row3c h_row1a_h_row2b_h_row3d
element1 2 24% 25 40
element2 3 26% 40 86
h_row1b_h_row2c_h_row3e h_row1b_h_row2c_h_row3f h_row1b_h_row2d_h_row3g h_row1b_h_row2d_h_row3h
element1 23 44% 76 34
element2 233 12% 55 12
关于r - 在R中自动获取复杂的 header ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44244341/