2015-03-31 44 views
1

我需要将大型数据集重组为一个特定的格式以供进一步分析。现在数据是长格式的,每个点都有多个记录。我需要重新整理数据,以便每个点都有一条记录,但它会添加许多新的时间特定数据列。我看过以前的类似帖子,但我最终需要将几个当前变量转换为列,而我找不到这样的例子。有没有一种方法可以在一次重塑中实现这个目标,或者我需要做几个步骤,然后将新的列连接起来?在我发布这个例子之前,另一个缺点是并不是所有的点都在每个时间步采样,所以我需要这些值显示为NA。例如(见下面的数据)SitePoint A1在2012年根本没有采样,2012年第一轮没有采样SitePoint A10,但是K83全部采样了9次。重塑缺失值和多个感兴趣值的大矩阵

mydatain <- structure(list(SitePoint = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 6L, 6L), .Label = c("A1", "A10", "K145", "K83", "T15", 
"T213"), class = "factor"), Year_Rotation = structure(c(1L, 2L, 
3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L, 1L, 2L, 4L, 5L, 
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 1L, 7L), .Label = c("2010_1", "2010_2", 
"2010_3", "2011_1", "2011_2", "2011_3", "2012_1", "2012_2", "2012_3" 
), class = "factor"), MR_Fire = structure(c(5L, 6L, 6L, 2L, 9L, 
9L, 5L, 6L, 6L, 2L, 9L, 9L, 7L, 8L, 16L, 17L, 21L, 22L, 23L, 
25L, 3L, 4L, 10L, 11L, 12L, 13L, 14L, 15L, 18L, 19L, 20L, 1L, 
2L, 2L, 5L, 6L, 6L, 11L, 11L, 12L, 7L, 24L), .Label = c("0", 
"1", "10", "11", "12", "13", "14", "15", "2", "23", "24", "25", 
"35", "36", "37", "39", "40", "47", "48", "49", "51", "52", "53", 
"8", "9"), class = "factor"), fire_seas = structure(c(2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
1L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 3L), .Label = c("dry", "fire", "wet" 
), class = "factor"), OptTSF = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 
1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 
0L, 1L, 1L)), .Names = c("SitePoint", "Year_Rotation", "MR_Fire", 
"fire_seas", "OptTSF"), row.names = c(31L, 32L, 33L, 34L, 35L, 
36L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 10543L, 10544L, 
10545L, 10546L, 10547L, 10548L, 10549L, 10550L, 14988L, 14989L, 
14990L, 14991L, 14992L, 14993L, 14994L, 14995L, 14996L, 17370L, 
17371L, 17372L, 17373L, 17374L, 17375L, 17376L, 17377L, 17378L, 
19353L, 19354L), class = "data.frame") 

最后,我需要的是这样的:

myfinal <- structure(list(SitePoint = structure(1:6, .Label = c("A1", "A10", 
"K145", "K83", "T15", "T213"), class = "factor"), MR_Fire_2010_1 = c(12L, 
12L, 39L, 23L, 0L, 14L), MR_Fire_2010_2 = c(13L, 13L, 40L, 24L, 
1L, NA), MR_Fire_2010_3 = c(13L, 13L, NA, 25L, 1L, NA), MR_Fire_2011_1 = c(1L, 
1L, 51L, 35L, 12L, NA), MR_Fire_2011_2 = c(2L, 2L, 52L, 36L, 
13L, NA), MR_Fire_2011_3 = c(2L, 2L, 53L, 37L, 13L, NA), MR_Fire_2012_1 = c(NA, 
NA, 9L, 47L, 24L, 8L), MR_Fire_2012_2 = c(NA, 14L, 10L, 48L, 
24L, NA), MR_Fire_2012_3 = c(NA, 15L, 11L, 49L, 25L, NA), season_2010_1 = structure(c(2L, 
2L, 1L, 2L, 2L, 1L), .Label = c("dry", "fire"), class = "factor"), 
    season_2010_2 = structure(c(2L, 2L, 1L, 2L, 2L, NA), .Label = c("dry", 
    "fire"), class = "factor"), season_2010_3 = structure(c(1L, 
    1L, NA, 1L, 1L, NA), .Label = "fire", class = "factor"), 
    season_2011_1 = structure(c(2L, 2L, 1L, 2L, 2L, NA), .Label = c("dry", 
    "fire"), class = "factor"), season_2011_2 = structure(c(2L, 
    2L, 1L, 2L, 2L, NA), .Label = c("dry", "fire"), class = "factor"), 
    season_2011_3 = structure(c(2L, 2L, 1L, 2L, 2L, NA), .Label = c("dry", 
    "fire"), class = "factor"), season_2012_1 = structure(c(NA, 
    NA, 2L, 1L, 1L, 2L), .Label = c("fire", "wet"), class = "factor"), 
    season_2012_2 = structure(c(NA, 1L, 2L, 1L, 1L, NA), .Label = c("fire", 
    "wet"), class = "factor"), season_2012_3 = structure(c(NA, 
    1L, 2L, 1L, 1L, NA), .Label = c("fire", "wet"), class = "factor"), 
    OptTSF_2010_1 = c(1L, 1L, 0L, 1L, 1L, 1L), OptTSF_2010_2 = c(1L, 
    1L, 0L, 1L, 1L, NA), OptTSF_2010_3 = c(1L, 1L, NA, 1L, 1L, 
    NA), OptTSF_2011_1 = c(1L, 1L, 0L, 0L, 1L, NA), OptTSF_2011_2 = c(1L, 
    1L, 0L, 0L, 1L, NA), OptTSF_2011_3 = c(1L, 1L, 0L, 0L, 1L, 
    NA), OptTSF_2012_1 = c(NA, NA, 1L, 0L, 0L, 1L), OptTSF_2012_2 = c(NA, 
    1L, 1L, 0L, 0L, NA), OptTSF_2012_3 = c(NA, 1L, 1L, 0L, 0L, 
    NA)), .Names = c("SitePoint", "MR_Fire_2010_1", "MR_Fire_2010_2", 
"MR_Fire_2010_3", "MR_Fire_2011_1", "MR_Fire_2011_2", "MR_Fire_2011_3", 
"MR_Fire_2012_1", "MR_Fire_2012_2", "MR_Fire_2012_3", "season_2010_1", 
"season_2010_2", "season_2010_3", "season_2011_1", "season_2011_2", 
"season_2011_3", "season_2012_1", "season_2012_2", "season_2012_3", 
"OptTSF_2010_1", "OptTSF_2010_2", "OptTSF_2010_3", "OptTSF_2011_1", 
"OptTSF_2011_2", "OptTSF_2011_3", "OptTSF_2012_1", "OptTSF_2012_2", 
"OptTSF_2012_3"), class = "data.frame", row.names = c(NA, -6L 
)) 

实际的数据集大约是23656条记录X 15个变量,这样做手工很容易造成重大头痛和潜在的错误。任何帮助或建议表示赞赏。如果这已在其他地方得到解答,请致歉。我找不到任何直接适用的东西;一切似乎都与三列有关,只有一列被提取为新变量。谢谢。

SP

回答

2

dcastdata.table即devel的版本,v1.9.5可以投多个同时列。它可以从here安装。

library(data.table) ## v1.9.5+ 
dcast(setDT(mydatain), SitePoint~Year_Rotation, 
     value.var=c('MR_Fire', 'fire_seas', 'OptTSF')) 
+1

这看起来就像我希望的那样。我现在正在下载/更新以尝试它。非常感谢。 – 2015-03-31 20:27:34

+0

@ A.Birdman感谢您的意见。我希望这个对你有用。 – akrun 2015-03-31 20:32:46

+0

我终于得到了一切更新(无论如何都需要发生),并安装了data.table的v1.9.5,它的工作原理与我上传的有限数据集相似。再次感谢你让我的生活变得更加愉快! – 2015-04-01 15:30:04

1

您可以使用reshape你的数据帧的结构从长变为宽使用下面的代码:

reshape(mydatain,timevar="Year_Rotation",idvar="SitePoint",direction="wide")