重塑具有缺失值和多个感兴趣的变量的大矩阵

时间:2015-03-31 19:07:17

标签: r reshape

我需要将大型数据集重组为特定格式以供进一步分析。现在数据是长格式的,每个点都有多个记录。我需要重新整形数据,以便每个点都有一个记录,但它会添加许多新的时间特定数据列。我看过以前类似的帖子,但我需要最终将几个当前变量转换为列,我找不到这样的例子。有没有办法在单个重塑中实现这一点,或者我必须做几个然后将新列连接在一起?在我发布示例之前的另一个问题是,并非所有点都在每个时间步进行采样,因此我需要将这些值显示为NA。例如,(见下面的数据)2012年没有对SitePoint A1进行采样,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 个答案:

答案 0 :(得分:2)

来自dcast的开发版本的

data.table,即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 :(得分:1)

您可以使用reshape使用以下代码将数据框架的结构从长更改为:

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