创建包含多行的新列

时间:2015-09-24 00:29:46

标签: r row reshape data-manipulation

我的数据框如下:

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的新手,非常感谢任何帮助 - 谢谢!

1 个答案:

答案 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