【发布时间】:2021-05-27 22:29:23
【问题描述】:
我正在尝试在表格中获得滚动加权和,并且有一种涉及矩阵乘法的方法,但是当某些数据丢失时它会中断。
所以如果我使用
library(tidyverse)
mydata <- tibble(Country = c("Australia", "Canada"),
"1980" = c(1000, 2000),
"1981" = c(1100, 2100),
"1982" = c(1300, 2300),
"1983" = c(1200, 2400),
"1984" = c(1400, 2200),
"1985" = c(1500, 2500))
weights <- c(3, 4, 6)
n0 <- ncol(mydata) - length(weights)
matweights <- matrix(rep(c(rep(0, n0), weights), n0)[-(1:n0)], ncol=n0)
tibble(cbind(mydata[, 1], as.matrix(mydata[, -1]) %*% matweights))
我得到我想要的东西
# A tibble: 2 x 5
Country `1` `2` `3` `4`
<chr> <dbl> <dbl> <dbl> <dbl>
1 Australia 15200 15700 17100 18200
2 Canada 28200 29900 29700 31000
例如右上角的18200 是3*1200 + 4*1400 + 6*1500
但是,例如,如果缺少其中一个值,比如mydata[2, 3] <- NA,那么我会得到
# A tibble: 2 x 5
Country `1` `2` `3` `4`
<chr> <dbl> <dbl> <dbl> <dbl>
1 Australia 15200 15700 17100 18200
2 Canada NA NA NA NA
当我想要时
# A tibble: 2 x 5
Country `1` `2` `3` `4`
<chr> <dbl> <dbl> <dbl> <dbl>
1 Australia 15200 15700 17100 18200
2 Canada NA NA 29700 31000
我的矩阵方法的问题是0 * NA 在我希望它是0 时给出NA。我知道有使用某种 apply 方法的解决方案,但我怀疑使用大表可能会更慢。
【问题讨论】:
-
这似乎解决了您想要的问题,带有 NA 处理的矩阵乘法:stackoverflow.com/questions/16535084/…
-
@Baroque 这是一个好主意(将 NA 变为 0,进行乘法,然后将 0 变为 NA)。在我的真实情况下,0 是可能的,虽然不太可能
标签: r missing-data