2

我正在导入一个 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

这里, alpha、betagamma都是层次结构的一级,而var1var2var3var4是第二级。

我想要它做的是得到如下输出,其中行名是连接的,但也要记住数据的结构。

   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

这里有什么想法吗?一直找不到任何东西来处理这个问题。提前致谢。

4

1 回答 1

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
于 2012-04-03T23:35:50.720 回答