对矩阵使用应用而不是循环
Use of apply instead of loops for a matrix
我有一个包含 150 列和 100.000 行的矩阵 (all_parameters)。该矩阵中每个数据元素的值为“1”。现在,如果满足以下条件,我想用“0”替换这些值:
col name 10, 14, 27
行名以 "T1_"
开头
我有以下循环可以正常工作:
T1_missing = c(10,14,27)
for(i in 1:ncol(all_parameters)) {
if (any(T1_missing == as.integer(colnames(all_parameters)[i]))) {
for(j in 1:nrow(all_parameters)) {
if(grepl("^T1_", rownames(all_parameters)[j])) {
all_parameters[j,i] <- 0
}
}
}
}
问题是循环的执行需要非常长的时间。我已经尝试使用 apply 函数,但是我无法使其工作。谁能告诉我如何使用 apply 函数(或任何其他比 for 循环更好更快的函数)来解决这个问题。
感谢您的帮助!
不用apply
也可以:
df <- data.frame(`10` = rnorm(3), `7` = head(letters,3), `14` = rnorm(3),
check.names = FALSE, row.names = c('T1_A', 'ABC', 'T1_B'))
## 10 7 14
##T1_A -1.8234804 a 1.31575373
##ABC -0.4232959 b 0.01400561
##T1_B -1.1252495 c -0.32442049
rows.to.change <- grepl('T1_', rownames(df))
cols.missing <- c(10, 14, 27)
cols.to.change <- as.integer(colnames(df)) %in% cols.missing
df[rows.to.change, cols.to.change] <- 0
## 10 7 14
##T1_A 0.0000000 a 0.00000000
##ABC -0.4232959 b 0.01400561
##T1_B 0.0000000 c 0.00000000
这是否只是一个简单的矢量化操作:
all_parameters[ grepl("^T1_", rownames(all_parameters) ), T1_missing] <- 0
行的更多条件将添加 &
(这可能会使条件更具限制性)或 |
(以包含更多行)。
我假设您使用术语 "col names" 实际上是指通过它们的数字位置来引用它们。使用 [ i, j]
操作,您可以将 i-rows 中的逻辑索引与 j-columns 中的数字索引混合。 (现在用 jbaums 的示例进行了测试:自从他删除后现在在此处复制:
m <- matrix(1, ncol=30, nrow=12,
dimnames=list(paste0('T', rep(1:3, each=4), '_', rep(1:4, 3)),
1:30))
我有一个包含 150 列和 100.000 行的矩阵 (all_parameters)。该矩阵中每个数据元素的值为“1”。现在,如果满足以下条件,我想用“0”替换这些值:
col name 10, 14, 27 行名以 "T1_"
开头我有以下循环可以正常工作:
T1_missing = c(10,14,27)
for(i in 1:ncol(all_parameters)) {
if (any(T1_missing == as.integer(colnames(all_parameters)[i]))) {
for(j in 1:nrow(all_parameters)) {
if(grepl("^T1_", rownames(all_parameters)[j])) {
all_parameters[j,i] <- 0
}
}
}
}
问题是循环的执行需要非常长的时间。我已经尝试使用 apply 函数,但是我无法使其工作。谁能告诉我如何使用 apply 函数(或任何其他比 for 循环更好更快的函数)来解决这个问题。
感谢您的帮助!
不用apply
也可以:
df <- data.frame(`10` = rnorm(3), `7` = head(letters,3), `14` = rnorm(3),
check.names = FALSE, row.names = c('T1_A', 'ABC', 'T1_B'))
## 10 7 14
##T1_A -1.8234804 a 1.31575373
##ABC -0.4232959 b 0.01400561
##T1_B -1.1252495 c -0.32442049
rows.to.change <- grepl('T1_', rownames(df))
cols.missing <- c(10, 14, 27)
cols.to.change <- as.integer(colnames(df)) %in% cols.missing
df[rows.to.change, cols.to.change] <- 0
## 10 7 14
##T1_A 0.0000000 a 0.00000000
##ABC -0.4232959 b 0.01400561
##T1_B 0.0000000 c 0.00000000
这是否只是一个简单的矢量化操作:
all_parameters[ grepl("^T1_", rownames(all_parameters) ), T1_missing] <- 0
行的更多条件将添加 &
(这可能会使条件更具限制性)或 |
(以包含更多行)。
我假设您使用术语 "col names" 实际上是指通过它们的数字位置来引用它们。使用 [ i, j]
操作,您可以将 i-rows 中的逻辑索引与 j-columns 中的数字索引混合。 (现在用 jbaums 的示例进行了测试:自从他删除后现在在此处复制:
m <- matrix(1, ncol=30, nrow=12,
dimnames=list(paste0('T', rep(1:3, each=4), '_', rep(1:4, 3)),
1:30))