我想将列表矩阵中的所有0转换为NA.我想出了如何完成这项任务的方法.但是,它太复杂了,我认为应该有一个简单的方法来做到这一点.这里有一些示例数据:
ABlue <- list("111.2012"=matrix(c(1, 0, 6, 0, 1, 0),
nrow = 1, byrow = T),
"112.2012"=matrix(c(6, 2, 2, 0, 3, 1),
nrow = 1, byrow = T),
"111.2011"=matrix(c(3, 2, 0, 0, 1, 9),
nrow = 1, byrow = T),
"112.2011"=matrix(c(1, 2, 0, 0, 7, 0),
nrow = 1, byrow = T))
CNTRYs <- c("USA", "GER", "UK", "IT", "CND", "FRA")
ABlue <- lapply(ABlue , "colnames<-", CNTRYs ) # gets names from Country list
Run Code Online (Sandbox Code Playgroud)
重要的是,原始矩阵已经将国家/地区名称作为名称,因此与此列表(ABlue)匹配会很不错.
这是我现在使用的方式:
ABlue.df<-data.frame(do.call("rbind",ABlue)) # two step approach to …Run Code Online (Sandbox Code Playgroud) 我想根据存储在向量中的名称在列表中聚合(求和)矩阵.这里有一些示例数据:
lst <- list("111"=matrix(c(1, 0, 6, NA, 1, 0),
nrow = 1, byrow = T),
"112"=matrix(c(6, 2, 2, 0, 3, NA),
nrow = 1, byrow = T),
"113"=matrix(c(2, 3, 0, 0, 1, 1),
nrow = 1, byrow = T))
agg.nam <- c(111,113)
Run Code Online (Sandbox Code Playgroud)
我的预期结果是:
> res
$
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3 3 6 0 2 1
Run Code Online (Sandbox Code Playgroud)
因此,第一个和第三个矩阵相加(na.rm = TRUE).
我首先尝试将agg.nam子集化:
lapply(lst, function(x) x[, which(names(x) %in% agg.nam)] )
Run Code Online (Sandbox Code Playgroud)
但是我在这一点上已经失败了,没有聚合.
我想匹配/加入两个矩阵,一个小值的值应该通过rownames/colnames匹配更大的矩阵.我只找到了这个答案.但是,我无法匹配位置,因为代码行在frn <- as.matrix(bigMatrix[[1]])我的情况下不起作用.内,外...加入的答案,在这里并没有帮助,因为我想匹配/加入了很多不同的列(而不是如用于X CostumerID和y的一个客户ID).
因为我使用的矩阵是126x104和193x193矩阵.我准备了示例数据:1.较大的矩阵,其中应包括较小的矩阵(字母在原始数据集国家名称中):
a = c("A", "B", "C", "D", "E", "F")
full_matrix = matrix(nrow = length(a), ncol=length(a))
dimnames(full_matrix) <- list(levels(as.factor(a)), levels(as.factor(a)))
full_matrix
A B C D E F
A NA NA NA NA NA NA
B NA NA NA NA NA NA
C NA NA NA NA NA NA
D NA NA NA NA NA NA
E NA NA NA NA NA NA
F NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)
而较小的矩阵:
matrix …Run Code Online (Sandbox Code Playgroud) 我想在两个列表上运行以下函数:
function(Z, p) {
imp <- as.vector(cbind(imp=rowSums(Z)))
exp <- as.vector(t(cbind(exp=colSums(Z))))
x = p + imp
ac = p + imp - exp
einsdurchx = 1/as.vector(x)
einsdurchx[is.infinite(einsdurchx)] <- 0
A = Z %*% diag(einsdurchx)
R = solve(diag(length(p))-A) %*% diag(p)
C = ac * einsdurchx
R_bar = diag(as.vector(C)) %*% R
rR_bar = round(R_bar)
return(rR_bar)
}
Run Code Online (Sandbox Code Playgroud)
在 amatrix和 a上工作正常vector。但是,我需要在 alist of matrices和 a上运行此函数list of vectors。我lapply/mapply按照这个例子到目前为止尝试过,见下文。这里有一些示例数据显示了我的数据结构:
Z <- list("111.2012"= matrix(c(0,0,100,200,0,0,0,0,50,350,0,50,50,200,200,0),
nrow = …Run Code Online (Sandbox Code Playgroud) 我想要乘以一个矩阵列表(有一行),如下所示:
lst <- list("111.2012"=matrix(c(1, 0, 6, NA, 1, 0),
nrow = 1, byrow = T),
"112.2012"=matrix(c(6, 2, 2, 0, 3, NA),
nrow = 1, byrow = T))
Run Code Online (Sandbox Code Playgroud)
使用这样的矢量(与每个矩阵的长度相同):
vec <- c(1,2,3,1,2,3)
Run Code Online (Sandbox Code Playgroud)
并期待这个结果:
$`111.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 0 18 NA 2 0
$`112.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 6 4 6 0 6 NA
Run Code Online (Sandbox Code Playgroud)
我到目前为止尝试了这个:
mapply("*", lst, vec)
Map("*", lst, vec)
Run Code Online (Sandbox Code Playgroud)
这给了我三倍的数字和错误的数字.我还想过在mapply中使用lapply来添加列表,但是不知道怎么做.有什么建议?谢谢