我的数据框如下:
dat <- read.table(text=
"ID | Year | Month | Variable | Value1 | Value2 | Value3
1 | 1950 | 1 | PRCP | 0 | 1 | 0
1 | 1950 | 1 | TMAX | 52 | 51 | 52
1 | 1950 | 1 | TMIN | 41 | 41 | 39
1 | 1950 | 2 | PRCP | 1 | 0 | 1
1 | 1950 | 2 | TMAX | 55 | 57 | 58",
header=TRUE, sep="|")
有50个站点ID,年份跨度1950-2005,月份1-12,有3个天气变量(PRCP,TMAX和TMIN),然后列出Value1-Value31,每月的每一天都有天气变量测量。
我想创建一个如下所示的数据框:
ID | Date | PRCP
1 | 1950-01-01 | 0
1 | 1950-01-02 | 1
1 | 1950-01-03 | 0
到目前为止,我已经为每个天气变量创建了3个单独的数据集,但我不知道如何创建新列并相应地扩展行(每天需要有31个新行)这个月)。我是R的新手,非常感谢任何帮助 - 谢谢!
答案 0 :(得分:0)
我们可以使用commodity_ids=
中的melt/dcast
。我们将'data.frame'转换为'data.table'(data.table
),使用setDT(dat)
从'wide'转换为'long'格式,创建一个按以下顺序排列的序列列('ind') 'ID','年','月'和'变量'。通过粘贴'年','月'和'ind'创建“日期”列,然后使用melt
重新塑造为“广泛”格式。我们可以将所有信息都放在一个数据集中,而不是创建三个单独的数据集。
dcast
注意:在示例数据中,OP仅提供了3个Value列。我猜测在原始数据集中,它将是31列。
library(data.table)#v1.9.6+
dM <- melt(setDT(dat), measure=patterns('^Value'))
dM1 <- dM[, ind:= 1:.N, by = .(ID, Year, Month, Variable)]
dM1[, Date:=as.Date(sprintf('%04d-%02d-%02d', Year, Month, ind))]
dcast(dM1, ID+Date~Variable, value.var='value1')
# ID Date PRCP TMAX TMIN
#1: 1 1950-01-01 0 52 41
#2: 1 1950-01-02 1 51 41
#3: 1 1950-01-03 0 52 39
#4: 1 1950-02-01 1 55 NA
#5: 1 1950-02-02 0 57 NA
#6: 1 1950-02-03 1 58 NA