r - 通过匹配矩阵和字符向量的列名来为矩阵赋值
问题描述
我想创建一个矩阵并根据rownames
矩阵与字符向量的匹配来分配 1。
## Here is the small example matrix
x <- as.character(c("rm78", "mn05", "hg78"))
y <- as.character(c("JU67", "EX56", "abcd", "rm78", "xyh56", "def", "terr6572"))
z <- as.character(c("abcd", "rh990", "mn05", "rm78", "xyh56", "efdg", "bett72"))
common <- Reduce(union, list(x,y,z))
dat.names <- c("x", "y", "z")
mat0 <- matrix(0, nrow = length(common), ncol = length(dat.names))
colnames(mat0) <- dat.names
rownames(mat0) <- common
mat0
如果字符向量x
、y
和与矩阵的z
匹配,则将 1 分配给矩阵中的相应值。rownames
mat0
我为每个向量单独执行此操作并向矩阵添加值。我有一个超过 12 个这样的向量的列表,这样做是多余的。我认为可能有一种非常有效的方法来做到这一点。
for(i in rownames(mat0)[rownames(mat0) %in% x])
{
# first column
mat0[i , 1] <- 1
}
for(i in rownames(mat0)[rownames(mat0) %in% y])
{
# second column
mat0[i , 2] <- 1
}
for(i in rownames(mat0)[rownames(mat0) %in% z])
{
# third column
mat0[i , 3] <- 1
}
解决方案
是的,您不需要多个循环。事实上,你不需要任何:
mat0[] <- do.call(cbind, lapply(list(x, y, z), function(i) +(rownames(mat0) %in% i)))
mat0
#> x y z
#> rm78 1 1 1
#> mn05 1 0 1
#> hg78 1 0 0
#> JU67 0 1 0
#> EX56 0 1 0
#> abcd 0 1 1
#> xyh56 0 1 1
#> def 0 1 0
#> terr6572 0 1 0
#> rh990 0 0 1
#> efdg 0 0 1
#> bett72 0 0 1
推荐阅读
- flutter - 小部件问题 - 没有像我想要的那样显示
- authentication - Keycloak OIDC 身份提供程序内部服务器错误
- vue.js - 使用来自外部网站的参数打开 vue 子路由
- google-chrome - 即使使用 samesite=None,chrome 也会阻止 cookie
- python - 循环遍历文本文件中固定数量的字符
- java - 如何在 Java 中使用 AES 256 GCM 模式正确加密文本?
- python - 连接 .LAS(文本文件)删除可变数量的标题行,然后另存为文本
- powershell-2.0 - 使用 powershell v 2.0 下载文件
- java - 如何将多控制器的包库设置为我的 SwaggerConfiguration?
- powershell - Powershell将数组元素作为参数传递