【问题标题】:How do you convert a dataset with two headers in the wide format to a long format?如何将具有两个宽格式标题的数据集转换为长格式?
【发布时间】:2015-09-07 11:48:00
【问题描述】:

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

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. 用分隔符连接标题 1 和标题 2
  2. 使用melt()函数,并且
  3. 一分为二

但是,这不起作用,因为 melt 函数将我的字符更改为因子,然后我无法拆分它们。任何人都可以提供帮助或建议更好的方法吗?

【问题讨论】:

  • 您能否制作一个可重现的示例并包含代码和所需的输出?
  • 你可以as.character你的因子变量回字符。 tidyr 也确实可以做到这一点,但您的帖子中没有代码可供使用。

标签: r dataframe reshape melt data-cleaning


【解决方案1】:

数据

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), ]

熔化和铸造

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>

【讨论】:

    【解决方案2】:

    或者使用 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>
    

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      相关资源
      最近更新 更多