如何将具有宽格式的两个标题的数据集转换为长格式?

时间:2015-09-07 11:48:00

标签: r dataframe reshape melt data-cleaning

我有一个宽格式的数据集,如下所示:

header 1      x    x    x    y    y    z    z
header 2      1    2    3    1    2    1    2 
 2015         3.0  4.0  2.0  3.1  2.1  2.3  2.1
 2016         2.0  4.4  1.0  2.1  3.1  5.3  0.1  
 ...

我想将其更改为长格式,如下所示:

header 1      variable   1    2    3
 2015            x       3.0  4.0  2.0
 2015            y       3.1  2.1  N/A
 2015            Z       2.3  2.1  N/A
 2016           ...

这是我的方法:

  1. 使用分隔符
  2. 连接标题1和标题2
  3. 使用melt()函数和
  4. 拆分两个
  5. 但是,这不起作用,因为melt函数将我的角色更改为因子,然后我无法将它们分开。任何人都可以帮助或建议更好的方法吗?

2 个答案:

答案 0 :(得分:0)

数据

d <- read.table(header = FALSE, stringsAsFactors = FALSE,
                text = "header1      x    x    x    y    y    z    z
header2      1    2    3    1    2    1    2 
 2015         3.0  4.0  2.0  3.1  2.1  2.3  2.1
 2016         2.0  4.4  1.0  2.1  3.1  5.3  0.1")

连接前两行

names(d)[-1] <- paste(d[1, -1], d[2, -1], sep = ".")
d.new <- d[-(1:2), ]

融化&amp;投

d.m <- melt(d.new, "V1", variable_name = "var")
cast(cbind(d.m, colsplit(d.m$var, split = "\\.", names = c("variable",
    "number"))), V1 + variable  ~ number)

#     V1 variable   1   2    3
# 1 2015        x 3.0 4.0  2.0
# 2 2015        y 3.1 2.1 <NA>
# 3 2015        z 2.3 2.1 <NA>
# 4 2016        x 2.0 4.4  1.0
# 5 2016        y 2.1 3.1 <NA>
# 6 2016        z 5.3 0.1 <NA>

答案 1 :(得分:0)

或者与hadleyverse:

read.table(text="header_1      x    x    x    y    y    z    z
header_2      1    2    3    1    2    1    2
 2015         3.0  4.0  2.0  3.1  2.1  2.3  2.1
 2016         2.0  4.4  1.0  2.1  3.1  5.3  0.1", 
           header=FALSE, stringsAsFactors=FALSE) -> dat

# deal with "headers"
colnames(dat) <- c("year", sprintf("%s %s", dat[1,], dat[2,])[-1])

# reshape the data
gather(dat[-(1:2),], variable, value, -year) %>%
  separate(variable, c("variable", "i")) %>%
  spread(i, value)

##   year variable   1   2    3
## 1 2015        x 3.0 4.0  2.0
## 2 2015        y 3.1 2.1 <NA>
## 3 2015        z 2.3 2.1 <NA>
## 4 2016        x 2.0 4.4  1.0
## 5 2016        y 2.1 3.1 <NA>
## 6 2016        z 5.3 0.1 <NA>