2

我有一个长格式的数据集,包括每年 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

请注意,“冗余”的日期(即超过 1 个 8 月至 10 月的观察)溢出到 Fall2fl 列中。应删除所需范围之外的日期(即 11 月、12 月、6 月、7 月)。最终数据集应具有包含 Fl Er 和 Cmp 的附加列。

任何帮助,将不胜感激!

(链接到带有长数据的 .csv 文件http://mentor.coe.uh.edu/Data_Example_Long.csv

4

1 回答 1

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
于 2013-10-19T04:44:55.133 回答