我正在尝试重塑数据框架。它有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
我实际上阅读了几个组合和转换列的示例,但我能做到的唯一方法是编写一个函数。我很确定有一种更简单的方法,所以有人可以帮我解决这个问题吗?
提前致谢。
答案 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()
包中的tidyr
和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
答案 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"列。