【问题标题】:Best way to combine and keep columns组合和保留列的最佳方法
【发布时间】:2014-12-30 15:41:37
【问题描述】:

我正在尝试重塑数据框。它有 4 列:我想合并其中的 3 列并保留一列。举个例子可能更容易理解:

这就是它的样子:

year    x1  x2  x3
2000    4   3   9
2000    1   4   2
2002    4   3   7

这是重塑后的样子:

year    x1
2000    4
2000    3
2000    9
2000    1   
2000    4   
2000    2   
2002    4   
2002    3   
2002    7

我实际上阅读了几个示例来组合和转换列,但我能做到这一点的唯一方法是编写一个函数。我很确定有一个更简单的方法,所以有人可以帮我解决这个问题吗?

提前致谢。

【问题讨论】:

  • 还有一个:cbind(df[1], x1 = unlist(df[2:4]))

标签: r reshape rbind


【解决方案1】:

你可以试试

data.frame(year=rep(df$year,each=length(df)-1),x1=c(t(df[,-1])))

或使用reshape2 中的melt。但是,它会以不同的顺序给出结果

library(reshape2)
melt(df, id.var='year')[,-2]

【讨论】:

    【解决方案2】:

    你也可以通过 base R 的 reshape 来做到这一点:

    reshape(mydf, direction = "long", varying = 2:ncol(mydf), sep = "")
    #     year time x id
    # 1.1 2000    1 4  1
    # 2.1 2000    1 1  2
    # 3.1 2002    1 4  3
    # 1.2 2000    2 3  1
    # 2.2 2000    2 4  2
    # 3.2 2002    2 3  3
    # 1.3 2000    3 9  1
    # 2.3 2000    3 2  2
    # 3.3 2002    3 7  3
    

    或者使用我的“splitstackshape”包中的merged.stack(但您需要确保您的“id”列是唯一的)。

    library(splitstackshape)
    merged.stack(getanID(mydf, "year"), var.stubs = "x", sep = "var.stubs")
    #    year .id .time_1 x
    # 1: 2000   1       1 4
    # 2: 2000   1       2 3
    # 3: 2000   1       3 9
    # 4: 2000   2       1 1
    # 5: 2000   2       2 4
    # 6: 2000   2       3 2
    # 7: 2002   1       1 4
    # 8: 2002   1       2 3
    # 9: 2002   1       3 7
    

    如果您想删除“.id”和“.time_1”列,可以使用merged.stack(getanID(mydf, "year"), var.stubs = "x", sep = "var.stubs")[, c("year", "x"), with = FALSE]

    【讨论】:

    • 从现在开始我将使用“splitstackshape”来完成这类任务。感谢伟大的包裹。
    【解决方案3】:

    使用tidyr 包中的gather()dplyr 你可以这样做(但它会以不同的顺序得到结果):

    library(tidyr)
    library(dplyr)
    
    df %>%
      gather(variable, value, -year) %>%
      arrange(year)
    

    你会得到:

      year variable value
    1 2000        x1     4
    2 2000        x1     1
    3 2000        x2     3
    4 2000        x2     4
    5 2000        x3     9
    6 2000        x3     2
    7 2002        x1     4
    8 2002        x2     3
    9 2002        x3     7
    

    如果你想去掉变量名而只保留值:

    df %>%
      gather(variable, value, -year) %>%
      select(-variable) %>%
      arrange(year)
    

    你会得到:

      year value
    1 2000     4
    2 2000     1
    3 2000     3
    4 2000     4
    5 2000     9
    6 2000     2
    7 2002     4
    8 2002     3
    9 2002     7
    

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2015-08-03
      • 2011-04-17
      • 2019-08-20
      • 2011-10-23
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      相关资源
      最近更新 更多