【问题标题】:Create new column with multiple rows创建具有多行的新列
【发布时间】:2015-12-21 11:27:21
【问题描述】:

我有一个如下的数据框:

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 还很陌生,如果有任何帮助,我将不胜感激 - 谢谢!

【问题讨论】:

  • 你能把数据样本做成我可以复制/粘贴的东西吗?另外,您能否包含一些代码,以便我可以重现您得到的内容?你的第一个问题做得很好!

标签: r row reshape data-manipulation


【解决方案1】:

我们可以使用data.table 中的melt/dcast。我们将“data.frame”转换为“data.table”(setDT(dat)),使用melt从“宽”格式重塑为“长”格式,创建按“ID”分组的序列列(“ind”), “年”、“月”和“变量”。通过粘贴“年”、“月”和“ind”创建“日期”列,然后使用dcast 重塑为“宽”格式。我们可以将所有信息放在一个数据集中,而不是创建三个单独的数据集。

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

注意:在示例数据中,OP 仅提供了 3 个值列。我猜在原始数据集中应该是 31 列。

数据

dat <-  structure(list(ID = c(1, 1, 1, 1, 1), Year = c(1950, 1950, 1950, 
1950, 1950), Month = c(1, 1, 1, 2, 2), Variable = c("PRCP", "TMAX", 
"TMIN", "PRCP", "TMAX"), Value1 = c(0, 52, 41, 1, 55), Value2 = c(1, 
51, 41, 0, 57), Value3 = c(0, 52, 39, 1, 58)), .Names = c("ID", 
"Year", "Month", "Variable", "Value1", "Value2", "Value3"),
row.names = c(NA, -5L), class = "data.frame")

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多