2012-04-03 34 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