通过分割包含冗余观察的日期,将长格式数据转换为短格式

时间:2013-10-18 19:31:33

标签: r reshape

我有一个长格式的数据集,包括每年3到5次单次测试的3个分数的精确日期/时间测量。

    ID  Date                    Fl  Er  Cmp
    1   9/24/2010 11:38         15  2   17
    1   1/11/2011 11:53         39  11  25
    1   1/15/2011 11:36         39  11  39
    1   3/7/2011 11:28          95  58  2
    2   10/4/2010 14:35         35  9   6
    2   1/7/2011 13:11          32  7   8
    2   3/7/2011 13:11          79  42  30
    3   10/12/2011 13:22        17  3   18
    3   1/19/2012 14:14         45  15  36
    3   5/8/2012 11:55          29  6   11
    3   6/8/2012 11:55          74  37  7
    4   9/14/2012 9:15          62  28  18
    4   1/24/2013 9:51          82  45  9
    4   5/21/2013 14:04         135 87  17
    5   9/12/2011 11:30         98  61  18
    5   9/15/2011 13:23         55  22  9
    5   11/15/2011 11:34        98  61  17
    5   1/9/2012 11:32          55  22  17
    5   4/20/2012 11:30         23  4   17

我需要将这些数据转换为基于月份的时间段的短格式(即秋季= 8月至10月;冬季= 1月至2月;春季= 3月至5月)。一些乐队将包括每个参与者不止一个观察,因此,将需要"溢出"溢出"带。以下Fl分数的示例转换。

ID  Fall1Fl     Fall2Fl     Winter1Fl       Winter2Fl       Spring1Fl       Spring2Fl
1   15          NA          39              39              95              NA
2   35          NA          32              NA              79              NA
3   17          NA          45              NA              28              74
4   62          NA          82              NA              135             NA
5   98          55          55              NA              23              NA

请注意日期是多余的" (即超过8月1日至10月的观察结果)溢出到Fall2fl柱中。应删除在所需频段(即11月,12月,6月,7月)之外发生的日期。最终数据集应包含其他列,包括Fl Er和Cmp。

任何帮助将不胜感激!

(链接到包含长数据{。3}}的.csv文件)

1 个答案:

答案 0 :(得分:3)

这似乎可以满足您的需求,但完全与您想要的输出相匹配。我没有查看您的示例数据,以查看问题是否与您的示例所需输出或我已完成的转换有关,但您应该能够按照代码查看转换是如何进行的。

## Convert dates to actual date formats
mydf$Date <- strptime(gsub("/", "-", mydf$Date), format="%m-%d-%Y %H:%M")

## Factor the months so we can get the "seasons" that you want
Months <- factor(month(mydf$Date), levels=1:12)
levels(Months) <- list(Fall = c(8:10),
                       Winter = c(1:2),
                       Spring = c(3:5),
                       Other = c(6, 7, 11, 12))
mydf$Seasons <- Months

## Drop the "Other" seasons
mydf <- mydf[!mydf$Seasons == "Other", ]

## Add a "Year" column
mydf$Year <- year(mydf$Date)

## Add a "Times" column
mydf$Times <- as.numeric(ave(as.character(mydf$Seasons), 
                             mydf$ID, mydf$Year, FUN = seq_along))

## Load "reshape2" and use `dcast` on just one variable.
##   Repeat for other variables by changing the "value.var"
dcast(mydf, ID ~ Seasons + Times, value.var="Fluency")
#   ID Fall_1 Fall_2 Winter_1 Winter_2 Spring_2 Spring_3
# 1  1     15     NA       39       39       NA       95
# 2  2     35     NA       32       NA       79       NA
# 3  3     17     NA       45       NA       29       NA
# 4  4     62     NA       82       NA      135       NA
# 5  5     98     55       55       NA       23       NA