Я думаю, что вам лучше всего создать «длинный» файл с ID/date/value
, бегущим вниз по странице, а затем просто объединить его с исходными данными, совпадающими на ID
и date
:
merge(
transform(dat[1:2], ind=format(as.Date(DATE, format="%m/%d/%Y"), "%Y.%m.%d")),
cbind(dat["ID"], stack(dat[-(1:2)]))
)
# ID ind DATE values
#1 1 2002.08.01 8/1/2002 56
#2 2 2002.08.02 8/2/2002 59
#3 3 2002.08.02 8/2/2002 51
#4 4 2002.08.03 8/3/2002 12
cbind(dat["ID"], stack(dat[-(1:2)]))
дает длинный файл:
# ID values ind
#1 1 56 2002.08.01
#2 2 65 2002.08.01
#3 3 66 2002.08.01
# <snip>
И transform(dat[1:2], ind=format(as.Date(DATE, format="%m/%d/%Y"), "%Y.%m.%d"))
возвращает правильно отформатированную дату для merge
, затем:
# ID DATE ind
#1 1 8/1/2002 2002.08.01
#2 2 8/2/2002 2002.08.02
#3 3 8/2/2002 2002.08.02
#4 4 8/3/2002 2002.08.03
Где dat
дляэтот пример был:
dat <- read.table(text="ID DATE 2002.08.01 2002.08.02 2002.08.03 2002.08.04
1 8/1/2002 56 41 54 89
2 8/2/2002 65 59 69 10
3 8/2/2002 66 51 61 5
4 8/3/2002 11 21 12 32", header=TRUE, stringsAsFactors=FALSE)