简化循环并生成列表摘要
Simplify loops and produce summary of list
我有两个矩阵,第一个 (mat1) 描述活动,第二个 (mat2) 描述共同存在(单独、合作伙伴、朋友)。
第一个问题:你能帮我简化下面的代码行并去掉循环吗!
此代码在第三个矩阵 (mat3) 中存储在每个共同存在的情况下执行的活动(因此是 mat2 的结果)。
我存储所有单独完成的活动,然后与合作伙伴一起完成,然后与朋友一起完成。
我将每个共存的第三个矩阵(3 次)存储在名为 MatriX 的列表中。
mat1 = structure(c("1", "2", "3", "4", "5", "6", "sleep", "sleep", "sleep",
"sleep", "sleep", "sleep", "sleep", "eat", "eat", "tv", "tv",
"tv", "sleep", "tv", "eat", "eat", "eat", "eat"), .Dim = c(6L,
4L), .Dimnames = list(NULL, c("id", "t1", "t2", "t3")))
mat2 = structure(c("1", "2", "3", "4", "5", "6", "partner", "partner",
"partner", "partner", "partner", "partner", "alone", "alone",
"alone", "partner", "partner", "partner", "alone", "friends",
"friends", "partner", "partner", "partner"), .Dim = c(6L, 4L), .Dimnames = list(
NULL, c("id", "t1", "t2", "t3")))
MatriX = vector('list',3)
for(i in 1:3){
MatriX[[i]] <- matrix('0', ncol = ncol(mat1), nrow = nrow(mat1))
}
for(j in 1:ncol(mat3)){
for(i in 1:nrow(mat3)){
if
(mat2[i,j] == 'alone')
{MatriX[[1]][i,j] <- mat1[i,j]}
}
}
for(j in 1:ncol(mat3)){
for(i in 1:nrow(mat3)){
if
(mat2[i,j] == 'partner')
{MatriX[[2]][i,j] <- mat1[i,j]}
}
}
for(j in 1:ncol(mat3)){
for(i in 1:nrow(mat3)){
if
(mat2[i,j] == 'friends')
{MatriX[[3]][i,j] <- mat1[i,j]}
}
}
names(MatriX) <- c('alone', 'partner', 'friends')
MatriX
第二个问题:
我需要获取列表 MatriX 中存储的 3 个矩阵的摘要。
round(prop.table(table(MatriX$alone)), 2)
round(prop.table(table(MatriX$partner)), 2)
round(prop.table(table(MatriX$friends)), 2)
我想要的输出可能如下所示:
Act Alone Partner Friends
1 0 0.83 0.5 0.92
2 eat 0.08 0.12 0.04
3 sleep 0.08 0.25 0.04
4 tv 0 0.12 0
对于第一部分,您可以删除其中一个嵌套循环。
m1 <- matrix('0', ncol=ncol(mat1), nrow=nrow(mat1))
lst <- lapply(c('alone', 'partner', 'friends'), function(x) {
m1[mat2==x] <- mat1[mat2==x]
m1})
names(lst) <- c('alone', 'partner', 'friends')
通过 melt
ing 'lst' 并在长格式上应用 table/prop.table
可以轻松完成第二部分。
library(reshape2)
round(prop.table(table(melt(lst)[3:4]), margin=2),2)
# L1
#value alone friends partner
# 0 0.83 0.92 0.50
# eat 0.08 0.04 0.12
# sleep 0.08 0.00 0.25
# tv 0.00 0.04 0.12
我有两个矩阵,第一个 (mat1) 描述活动,第二个 (mat2) 描述共同存在(单独、合作伙伴、朋友)。
第一个问题:你能帮我简化下面的代码行并去掉循环吗! 此代码在第三个矩阵 (mat3) 中存储在每个共同存在的情况下执行的活动(因此是 mat2 的结果)。 我存储所有单独完成的活动,然后与合作伙伴一起完成,然后与朋友一起完成。 我将每个共存的第三个矩阵(3 次)存储在名为 MatriX 的列表中。
mat1 = structure(c("1", "2", "3", "4", "5", "6", "sleep", "sleep", "sleep",
"sleep", "sleep", "sleep", "sleep", "eat", "eat", "tv", "tv",
"tv", "sleep", "tv", "eat", "eat", "eat", "eat"), .Dim = c(6L,
4L), .Dimnames = list(NULL, c("id", "t1", "t2", "t3")))
mat2 = structure(c("1", "2", "3", "4", "5", "6", "partner", "partner",
"partner", "partner", "partner", "partner", "alone", "alone",
"alone", "partner", "partner", "partner", "alone", "friends",
"friends", "partner", "partner", "partner"), .Dim = c(6L, 4L), .Dimnames = list(
NULL, c("id", "t1", "t2", "t3")))
MatriX = vector('list',3)
for(i in 1:3){
MatriX[[i]] <- matrix('0', ncol = ncol(mat1), nrow = nrow(mat1))
}
for(j in 1:ncol(mat3)){
for(i in 1:nrow(mat3)){
if
(mat2[i,j] == 'alone')
{MatriX[[1]][i,j] <- mat1[i,j]}
}
}
for(j in 1:ncol(mat3)){
for(i in 1:nrow(mat3)){
if
(mat2[i,j] == 'partner')
{MatriX[[2]][i,j] <- mat1[i,j]}
}
}
for(j in 1:ncol(mat3)){
for(i in 1:nrow(mat3)){
if
(mat2[i,j] == 'friends')
{MatriX[[3]][i,j] <- mat1[i,j]}
}
}
names(MatriX) <- c('alone', 'partner', 'friends')
MatriX
第二个问题: 我需要获取列表 MatriX 中存储的 3 个矩阵的摘要。
round(prop.table(table(MatriX$alone)), 2)
round(prop.table(table(MatriX$partner)), 2)
round(prop.table(table(MatriX$friends)), 2)
我想要的输出可能如下所示:
Act Alone Partner Friends
1 0 0.83 0.5 0.92
2 eat 0.08 0.12 0.04
3 sleep 0.08 0.25 0.04
4 tv 0 0.12 0
对于第一部分,您可以删除其中一个嵌套循环。
m1 <- matrix('0', ncol=ncol(mat1), nrow=nrow(mat1))
lst <- lapply(c('alone', 'partner', 'friends'), function(x) {
m1[mat2==x] <- mat1[mat2==x]
m1})
names(lst) <- c('alone', 'partner', 'friends')
通过 melt
ing 'lst' 并在长格式上应用 table/prop.table
可以轻松完成第二部分。
library(reshape2)
round(prop.table(table(melt(lst)[3:4]), margin=2),2)
# L1
#value alone friends partner
# 0 0.83 0.92 0.50
# eat 0.08 0.04 0.12
# sleep 0.08 0.00 0.25
# tv 0.00 0.04 0.12