使用数据(R)将具有两列的data.frame重新整形为多列

时间:2013-12-04 11:13:19

标签: r casting dataframe reshape melt

一个微不足道的问题,但我还是找不到答案。

我想将数据框列'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")

但无济于事

1 个答案:

答案 0 :(得分:5)

你真的没有“ID”变量,所以你需要创建一个。如果Yearcharacter变量会更容易,所以除了添加“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