r - 根据R中另一个矩阵的内容填充矩阵
问题描述
我想根据另一个矩阵的内容填充一个矩阵。以下是矩阵:
set.seed(135)
MAT1 <- replicate(6, sample(c("00", "01", "10", "11", "10"))); MAT1 <- t(MAT1)
rownames(MAT1) <- rep(letters[1:3], each = 2)
MAT1
[,1] [,2] [,3] [,4] [,5]
a "00" "01" "10" "11" "10"
a "10" "00" "01" "11" "10"
b "10" "10" "00" "11" "01"
b "11" "10" "01" "00" "10"
c "10" "00" "01" "10" "11"
c "00" "10" "11" "01" "10"
LIST <- apply(X = MAT1, MARGIN = 2, FUN = unique)
MAT2 <- matrix(data = NA, nrow = 3, ncol = length(unlist(LIST)))
rownames(MAT2) <- c(letters[1:3]); colnames(MAT2) <- unlist(LIST)
MAT2 <- rbind(Hap = rep(1:length(LIST), lengths(LIST)), MAT2)
MAT2
1 1 1 2 2 2 3 3 3 3 4 4 4 4 5 5 5
Hap 00 10 11 01 00 10 10 01 00 11 11 00 10 01 10 01 11
a NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
b NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
c NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
( ) 的第一行 (Hap)MAT2
包含MAT2[1,]
MAT1 每一列的模态,但删除了重复的模态。在colnames(MAT2)
, 1 1 1 表示 MAT1 的第 1 列有三种独特的模态,2 2 2 表示 MAT1 的第 2 列有三种独特的模态,依此类推。我想通过 MAT1 填充 MAT2 以便对于给定的 Hap 和colnames 根据 Hap 出现的次数填充 0、1 或 2 MAT1
。以下是预期的MAT2
:
1 1 1 2 2 2 3 3 3 3 4 4 4 4 5 5 5
Hap 00 10 11 01 00 10 10 01 00 11 11 00 10 01 10 01 11
a 1 1 0 1 1 0 1 1 0 0 2 0 0 0 2 0 0
b 0 1 1 0 0 2 0 1 1 0 1 1 0 0 1 1 0
c 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 0 1
解决方案
我们将 'MAT1' 按列拆分,遍历,在ing 进入两列数据集后list
获取table
计数。stack
然后循环并分配'MAT2'中与提取的元素具有相同名称names
的列list
list
lst1 <- lapply(asplit(MAT1, 2), function(x) as.data.frame.matrix(table(stack(x)[2:1])))
names(lst1) <- seq_along(lst1)
for(nm in names(lst1)) {
MAT2[-1, colnames(MAT2) == nm] <- as.matrix(lst1[[nm]])
}
-输出
MAT2
# 1 1 1 2 2 2 3 3 3 4 4 4 4 5 5 5 5
#Hap "00" "10" "11" "10" "11" "01" "10" "00" "01" "11" "01" "10" "00" "01" "10" "11" "00"
#a "1" "1" "0" "0" "1" "1" "1" "0" "1" "0" "1" "0" "1" "0" "1" "1" "0"
#b "1" "0" "1" "0" "2" "0" "0" "2" "0" "0" "0" "2" "0" "1" "0" "0" "1"
#c "0" "1" "1" "1" "1" "0" "0" "1" "1" "1" "0" "1" "0" "1" "0" "0" "1"
数据
MAT1 <- structure(c("00", "10", "00", "11", "10", "11", "10", "11", "10",
"10", "10", "01", "10", "00", "01", "01", "01", "10", "11", "01",
"10", "10", "00", "10", "01", "10", "11", "00", "11", "00"), .Dim = 6:5,
.Dimnames = list(
c("a", "a", "b", "b", "c", "c"), NULL))
MAT2 <- structure(c("00", NA, NA, NA, "10", NA, NA, NA, "11", NA, NA,
NA, "10", NA, NA, NA, "11", NA, NA, NA, "01", NA, NA, NA, "10",
NA, NA, NA, "00", NA, NA, NA, "01", NA, NA, NA, "11", NA, NA,
NA, "01", NA, NA, NA, "10", NA, NA, NA, "00", NA, NA, NA, "01",
NA, NA, NA, "10", NA, NA, NA, "11", NA, NA, NA, "00", NA, NA,
NA), .Dim = c(4L, 17L), .Dimnames = list(c("Hap", "a", "b", "c"
), c("1", "1", "1", "2", "2", "2", "3", "3", "3", "4", "4", "4",
"4", "5", "5", "5", "5")))
推荐阅读
- django - 如何从嵌套表示 Django 中排除字段?
- git - 使用 Powershell 脚本在 Azure 上配置 CI/CD 管道
- json - 如何将 PySpark.rdd.RDD 转换为 JSON?
- c++ - cmake customization target_link_libraries prefix/suffix
- date - 从不同国家/地区的烧瓶后端服务器管理时间
- c# - 如何在 .Net Core 中的 AWS S3 中将对象从一个存储桶复制/移动到另一个存储桶
- typescript - 具有正确返回类型的函数的元组参数
- google-app-engine - Google Cloud App Engine WebSocket 连接在大约 1 小时后关闭
- sql-server - 无法连接到虚拟机上的远程 Sql 服务器
- azure-active-directory - 在 SQL DW (Synapse) 中授予对 Azure Active Directory 组的读取权限