在 r 中划分维度不等的矩阵
Dividing matrices with unequal dimensions in r
我有一个过滤到一个月的数据集。我还有一个矩阵列表 (l1
),它与数据帧列表 (int1
) 的长度相同。列表中的矩阵具有不同的维度(例如,3x3、2x2)。
正在设置数据和列表:
library(lubridate)
library(tidyverse)
library(purrr)
date <- rep_len(seq(dmy("26-12-2010"), dmy("13-07-2011"), by = "days"), 200)
ID <- rep(c("A","B"), 100)
df <- data.frame(date = date,
x = runif(length(date), min = 60000, max = 80000),
y = runif(length(date), min = 800000, max = 900000),
ID)
df$jDate <- julian(as.Date(df$date), origin = as.Date('1970-01-01'))
df$Month <- month(df$date)
# First 10-day interval for `A`
t1 <- c(100,150,200)
# Second 10-day interval for `A`
t2 <- c(200,250,350)
# Third 10-day interval for `A`
t3 <- c(300,350, 400)
mat <- cbind(t1,t2, t3)
# First 10-day interval for `B`
t1 <- c(150,150)
# Second 10-day interval for `B`
t2 <- c(250,250)
mat2 <- cbind(t1,t2)
l1 <- list(mat, mat2)
int1 <- df %>%
# arrange(ID) %>% # skipped for readability of result
mutate(new = floor_date(date, '10 day')) %>%
mutate(new = if_else(day(new) == 31, new - days(10), new)) %>%
group_by(ID, new) %>%
filter(Month == "3") %>%
group_split()
下面的代码试图将 lstMat
与 l1
相除。我 运行 遇到的问题是 lstMat
中的矩阵与 l1
中的矩阵维度不同。由于这种差异,当我尝试将一个与另一个分开时,我收到错误消息:Error in .x/.y : non-conformable arrays
g1 <- as.integer(gl(length(int1), 3, length(int1)))
f2 <- function(.int1, .int2) {
t(outer(seq_along(.int1), seq_along(.int2),
FUN = Vectorize(function(i, j) min(.int1[[i]]$jDate) -
min(.int2[[j]]$jDate))))
}
lstMat <- map2(split(int1, g1), split(int1, g1), f2)
map2(l1, lstMat[1:2], `/`)
关于如何修改此代码以允许矩阵与列表的差异有任何想法吗?
问题:
我有不同维度的矩阵,我一直试图划分这些矩阵。假设我 运行 一个自定义函数并以 l1
结尾。 l1
中的矩阵对应于 int1
中的 10 天间隔,但我们没有得到 ID
B
的第三个 10 天间隔的输出,因此2x2 矩阵。
规则:
在这种情况下,我想从 lstMat[[2]]
中删除第三列,因为那是 l1[[2]]
中缺少的那一列。情况并非总是如此,例如,如果 l1[[2]]
中缺少第二个 10 天间隔,那么我想删除 lsMat[[2]]
.
中的第二列
我想 link lstMat
和 l1
通过使用 int1
基于最终从 lstMat
中删除的特定间隔.
我希望我没有让这更混乱。如果我这样做了,我深表歉意。
感谢您的宝贵时间。
这里 'g1' 需要根据 'lstMat' 中每个元素的 rows/dimensions 的数量动态变化。这可以通过 rep
来完成
library(purrr)
g1 <- rep(seq_along(lstMat), sapply(lstMat, nrow))
lstMat <- map2(split(int1, g1), split(int1, g1), f2)
map2(l1, lstMat[1:2], `/`)
[[1]]
t1 t2 t3
[1,] Inf 20 15
[2,] -15 Inf 35
[3,] -10 -35 Inf
[[2]]
t1 t2
[1,] Inf 25
[2,] -15 Inf
有些值是 Inf
只是因为我们在 'lstMat' 中有一些值是 '0'
lstMat[1:2]
$`1`
[,1] [,2] [,3]
[1,] 0 10 20
[2,] -10 0 10
[3,] -20 -10 0
$`2`
[,1] [,2]
[1,] 0 10
[2,] -10 0
因此任何值除以 0 returns Inf
我有一个过滤到一个月的数据集。我还有一个矩阵列表 (l1
),它与数据帧列表 (int1
) 的长度相同。列表中的矩阵具有不同的维度(例如,3x3、2x2)。
正在设置数据和列表:
library(lubridate)
library(tidyverse)
library(purrr)
date <- rep_len(seq(dmy("26-12-2010"), dmy("13-07-2011"), by = "days"), 200)
ID <- rep(c("A","B"), 100)
df <- data.frame(date = date,
x = runif(length(date), min = 60000, max = 80000),
y = runif(length(date), min = 800000, max = 900000),
ID)
df$jDate <- julian(as.Date(df$date), origin = as.Date('1970-01-01'))
df$Month <- month(df$date)
# First 10-day interval for `A`
t1 <- c(100,150,200)
# Second 10-day interval for `A`
t2 <- c(200,250,350)
# Third 10-day interval for `A`
t3 <- c(300,350, 400)
mat <- cbind(t1,t2, t3)
# First 10-day interval for `B`
t1 <- c(150,150)
# Second 10-day interval for `B`
t2 <- c(250,250)
mat2 <- cbind(t1,t2)
l1 <- list(mat, mat2)
int1 <- df %>%
# arrange(ID) %>% # skipped for readability of result
mutate(new = floor_date(date, '10 day')) %>%
mutate(new = if_else(day(new) == 31, new - days(10), new)) %>%
group_by(ID, new) %>%
filter(Month == "3") %>%
group_split()
下面的代码试图将 lstMat
与 l1
相除。我 运行 遇到的问题是 lstMat
中的矩阵与 l1
中的矩阵维度不同。由于这种差异,当我尝试将一个与另一个分开时,我收到错误消息:Error in .x/.y : non-conformable arrays
g1 <- as.integer(gl(length(int1), 3, length(int1)))
f2 <- function(.int1, .int2) {
t(outer(seq_along(.int1), seq_along(.int2),
FUN = Vectorize(function(i, j) min(.int1[[i]]$jDate) -
min(.int2[[j]]$jDate))))
}
lstMat <- map2(split(int1, g1), split(int1, g1), f2)
map2(l1, lstMat[1:2], `/`)
关于如何修改此代码以允许矩阵与列表的差异有任何想法吗?
问题:
我有不同维度的矩阵,我一直试图划分这些矩阵。假设我 运行 一个自定义函数并以 l1
结尾。 l1
中的矩阵对应于 int1
中的 10 天间隔,但我们没有得到 ID
B
的第三个 10 天间隔的输出,因此2x2 矩阵。
规则:
在这种情况下,我想从 lstMat[[2]]
中删除第三列,因为那是 l1[[2]]
中缺少的那一列。情况并非总是如此,例如,如果 l1[[2]]
中缺少第二个 10 天间隔,那么我想删除 lsMat[[2]]
.
我想 link lstMat
和 l1
通过使用 int1
基于最终从 lstMat
中删除的特定间隔.
我希望我没有让这更混乱。如果我这样做了,我深表歉意。
感谢您的宝贵时间。
这里 'g1' 需要根据 'lstMat' 中每个元素的 rows/dimensions 的数量动态变化。这可以通过 rep
library(purrr)
g1 <- rep(seq_along(lstMat), sapply(lstMat, nrow))
lstMat <- map2(split(int1, g1), split(int1, g1), f2)
map2(l1, lstMat[1:2], `/`)
[[1]]
t1 t2 t3
[1,] Inf 20 15
[2,] -15 Inf 35
[3,] -10 -35 Inf
[[2]]
t1 t2
[1,] Inf 25
[2,] -15 Inf
有些值是 Inf
只是因为我们在 'lstMat' 中有一些值是 '0'
lstMat[1:2]
$`1`
[,1] [,2] [,3]
[1,] 0 10 20
[2,] -10 0 10
[3,] -20 -10 0
$`2`
[,1] [,2]
[1,] 0 10
[2,] -10 0
因此任何值除以 0 returns Inf