【问题标题】:Populating a matrix with multiple columns from an existing matrix matched against a data frame使用与数据框匹配的现有矩阵中的多列填充矩阵
【发布时间】:2012-03-27 18:41:42
【问题描述】:

我有一个数据矩阵,m

                 12345      12348
2011-05-13          NA 0.18001079
2011-05-16 0.056780170 0.15526660
2011-05-17 0.005848973 0.17363081
2011-05-18 0.096594178 0.20114677
2011-05-19 0.038920055 0.15744843

我有一个数据框,df

id    date
12345 2011-05-13
12345 2011-05-18
12348 2011-05-13
12348 2011-05-19

我想向我的数据框 df 添加一个新条目 e(我认为这是另一个矩阵,但我不确定术语),其中包含我的矩阵中 df 中日期前后 20 天的值。 “有用的一天”是指出现在 rownames(m) 中的一天。

id    date       e
12345 2011-05-13 [40x1 double matrix]
12345 2011-05-18 [40x1 double matrix]
12348 2011-05-13 [40x1 double matrix]
12348 2011-05-19 [40x1 double matrix]

我可以使用 matrixcalc 中的 shift.downshift.up 来查找当天前后的 20 个“有用天”,我可以使用 match(df$date,rownames(m) 来查找我需要的 m 索引。

但是在这里,我被卡住了。创建和填写新条目 e 以使其包含我需要的信息的最佳方式是什么?我知道当 -20 或 +20 的“有用天数”超出我的信息范围时会有 NA 条目,并且无论如何在 m 内也有 NA 条目。

非常感谢任何帮助。

【问题讨论】:

  • 很高兴您在这里提供了示例数据供我们查看,但是在 R 中手动重新创建数据集可能会很痛苦。如果您提供代码来重新创建您正在使用的示例数据,您将获得更快的答案。例如,如果您有matrix m,那么您只需键入dput(m),您将获得重新创建矩阵的命令,您可以将其粘贴到此处。同样,您可以提供用于获取 20 个“有用天”的代码,以便我们快速重现您的情况。
  • 谢谢,我不知道 dput 命令

标签: r matrix


【解决方案1】:

我有一种感觉,你想要做的总体上可能会以不同的方式完成,但这里是你所要求的解决方案。

# Create the data
m=matrix(c(NA,0.056780170,0.005848973,0.096594178,0.038920055,0.18001079,0.15526660,0.1736081,0.20114677,0.15744843),ncol=2)
colnames(m) = c(12345,12348)
rownames(m) = c('2011-05-13','2011-05-16','2011-05-17','2011-05-18','2011-05-19')

df=data.frame(id=c(12345,12345,12348,12348),date=as.Date(c('2011-05-13','2011-05-18','2011-    05-13','2011-05-19')))

这个想法是首先创建一个函数,该函数返回一对 id 和 date 的矩阵。我认为您不需要 matrixCalc 中的 shift.upshift.down 函数,但如果您觉得更简单,可以使用它。

# Create a function that returns a matrix for a single row    
get.matrix = function(id,date,shift=20) {
   row=match(as.character(date),rownames(m))
   rows=max(1,row-shift):min(nrow(m),row+shift)
   m[rows,as.character(id),drop=F] # The drop=F means that it won't be reduced to a vector
}

请注意,该函数通常会返回 41 行,而不是 40 行。此外,如果它是“早”或“晚”日期,那么它可能会返回更少。

# Apply that function to all rows
df$e=mapply(get.matrix,id=df$id,date=df$date,SIMPLIFY=F)

创建函数后,您可以将其应用于数据框中的每一行。

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2014-07-28
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多