一个微不足道的问题,但我还是找不到答案。
我想将数据框列'year'拆分为一组新列,每年列名称及其后面的数据:
Year FQ
1975 3.156
1975 8.980
1977 10.304
1977 7.861
1979 4.729
1979 7.216
1981 4.856
1981 3.438
1983 9.887
1983 3.850
期望的输出:
1975 1977 1979 1981 1983
3.156 10.304 4.729 4.856 9.887
8.980 7.861 7.216 3.438 3.850
示例数据:
d<-structure(list(Year = structure(1:10, .Label = c("1975", "1975",
"1977", "1977", "1979", "1979", "1981", "1981", "1983", "1983",
"1985", "1985", "1987", "1987", "1988", "1988", "1991", "1991",
"1993", "1993", "1995", "1995", "1997", "1997", "2000", "2000",
"2001", "2001", "2003", "2003", "2005", "2005", "2007", "2007",
"2009", "2009", "2011", "2011"), class = "factor"), FQ = c(3.156,
8.98, 10.304, 7.861, 4.729, 7.216, 4.856, 3.438, 9.887, 3.85)), .Names = c("Year",
"FQ"), class = "data.frame", row.names = c(1L, 62L, 123L, 184L,
245L, 306L, 367L, 428L, 489L, 550L))
我试过融化数据:
melt(d, id.vars = "Year")
然后使用演员:
cast(d, Year~value)
并重塑
d1<-reshape(d, idvar="Year", timevar="FQ", direction="wide")
但无济于事
答案 0 :(得分:5)
你真的没有“ID”变量,所以你需要创建一个。如果Year
是character
变量会更容易,所以除了添加“ID”变量外,我还在下面进行了转换:
d <- within(d, {
Year <- as.character(Year)
ID <- ave(Year, Year, FUN=seq_along)
})
从这里开始,很容易直接使用dcast
...
library(reshape2)
dcast(d, ID ~ Year, value.var="FQ")
# ID 1975 1977 1979 1981 1983
# 1 1 3.156 10.304 4.729 4.856 9.887
# 2 2 8.980 7.861 7.216 3.438 3.850
...或reshape
。
reshape(d, direction = "wide", idvar="ID", timevar="Year")
# ID FQ.1975 FQ.1977 FQ.1979 FQ.1981 FQ.1983
# 1 1 3.156 10.304 4.729 4.856 9.887
# 62 2 8.980 7.861 7.216 3.438 3.850