2012-04-03 64 views
1

我正在導入一個csv文件,該文件由一個雙列層次結構中具有列名稱的交叉表組成。當我拿到表R,結果是這樣的:跨多行的列名稱?

alpha X.1 X.2 beta X.1 X.2 X.3 gamma X.1 
    var1 var2 var3 var1 var2 var3 var4 var1 var4 
1  21 50 5 22 48 6 8 25 8 
2  27 50 5 24 48 6 8 33 8 
3  26 50 5 28 48 6 8 33 8 
4  25 50 5 28 48 6 8 20 8 

這裏,α,betagamma是層次結構的所有一個級別,而var1var2var3,並var4是第二級。

我想要做的就是得到像下面這樣的輸出,其中行名是串聯的,但也要記住數據的結構。

alpha_var1 alpha_var2 alpha_var3 beta_var1 beta_var2 beta_var3 beta_var4 gamma_var1 gamma_var4 
1   21   50   5  22   48   6   8   25   8 
2   27   50   5  24   48   6   8   33   8 
3   26   50   5  28   48   6   8   33   8 
4   25   50   5  28   48   6   8   20   8 

這裏的任何想法?無法找到任何解決此問題的方法。提前致謝。

+0

...該文件是什麼樣子? – Tommy 2012-04-03 22:42:20

+0

答案可能涉及到'read.table()'的兩次調用,以利用'skip'和'nrows'參數。 – Chase 2012-04-03 23:28:21

+0

該文件是一個csv,其中X.1,X.2等代表空白單元格。不知道如何上傳演示文件。 – user1202761 2012-04-04 01:12:45

回答

1

這似乎工作,雖然使用xts似乎對na.locf()功能有點沉重,但我知道它的工作原理和頻繁使用,所以這就是我使用的。

library(xts) 
#Read in data without headers 
x <- read.delim("Book1.txt", skip = 2, header = FALSE) 
#Read in header files transposing them into columns 
headers <- data.frame(t(read.delim("Book1.txt", nrows = 2, header = FALSE)), stringsAsFactors = FALSE) 

#Create a now column with the value of alpha, beta, gama or NA 
headers$vals <- with(headers, ifelse(grepl("[abg]", X1), X1, NA)) 
#Fill down the values above 
headers$vals <- na.locf(headers$vals) 
#Paste column names together 
colnames(x) <- with(headers, paste(vals, X2, sep = "_")) 
#Resulting object 
x 



alpha_var1 alpha_var2 alpha_var3 beta_var1 beta_var2 beta_var3 beta_var4 gamma_ var1 gamma_var4 
1   21   50   5  22  48   6   8   25   8 
2   27   50   5  24  48   6   8   33   8 
3   26   50   5  28  48   6   8   33   8 
4   25   50   5  28  48   6   8   20   8 
+0

感謝您的支持,但不幸的是,我正在尋找一種靈活適用於任何一組列名的解決方案。我已經通過指定grepl(「[a-z]」...)使它適用於任何字符集,但是我希望如果可能的話,更靈活的解決方案。 – user1202761 2012-04-04 01:24:42

+0

@ user1202761 - 您打算如何區分想要保留的列和不需要的列?找到相應的正則表達式來識別要保留的列不應該很難。你可以改爲搜索「X.1-9」模式嗎?像這樣的東西可以工作:'!(grepl(「X \\。\\ d」,x))''。它找到了模式「X」。然後是一個數字...然後採取否定的。 – Chase 2012-04-04 01:32:01

+0

從csv導入空標題單元格時會自動生成'X.1'等。如果你說'header = FALSE',它們顯示爲''。另一個問題是,如果在第一級和第二級中的任何一列都是'',則失敗。 – user1202761 2012-04-04 01:42:23