组合和保留列的最佳方式

时间:2014-12-30 15:41:38

标签: r reshape rbind

我正在尝试重塑数据框架。它有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

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

提前致谢。

3 个答案:

答案 0 :(得分:2)

你可以尝试

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您也可以使用基础R重塑:

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"你可以使用merged.stack(getanID(mydf, "year"), var.stubs = "x", sep = "var.stubs")[, c("year", "x"), with = FALSE]和" .time_1"列。