2017-05-29 16 views
0

例のようにヘッダーの行が複数ある場合は、Rのヘッダー行を検出してマージするスクリプト(下記参照)をリクエストしたいと思います。
1.ヘッダーの行数を確認します(2以上)。
2.ヘッダーギャップを入力します。例:NAsを参照してください。
3.すべてのヘッダー行を1つにマージします。
複雑なヘッダーを自動的に取得するR

私は手動でのみ行うことができます。以下を参照してください。たぶんこれは、任意の数の行を持つヘッダーで可能です。

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. 
+0

これまでに何を試みましたか?それを実装するあなたの具体的な問題は何ですか?あなたのコードを教えてください! – MrSmith42

答えて

1

このようなことが可能です。 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 
+0

thx、働いています。数値の列はchar型です。私はそれを解決することができます。 – Ferroao

関連する問題