在我下面的 R 代碼中,有很多重復,我理解是不必要的。
我想知道單線(或其他回圈結構)是否可以達到完全相同的結果?
library(metafor)
fit <- rma(yi~factor(grade),vi,data=dat.bangertdrowns2004)
rownames(fit$b)[rownames(fit$b) %in% "intrcpt"] <- "(Intercept)"
rownames(fit$beta)[rownames(fit$beta) %in% "intrcpt"] <- "(Intercept)"
rownames(fit$vb)[rownames(fit$vb) %in% "intrcpt"] <- "(Intercept)"
colnames(fit$vb)[colnames(fit$vb) %in% "intrcpt"] <- "(Intercept)"
uj5u.com熱心網友回復:
或者,使用 {tidyverse}:
library(dplyr)
library(metafor)
fit <- rma(yi~factor(grade),vi,data=dat.bangertdrowns2004)
fit2 <- fit %>%
purrr::map_at(c("b", "beta", "vb"), function(x) {
rownames(x)[rownames(x) %in% "intrcpt"] <- "(Intercept)"
return(x)
})
colnames(fit2$vb)[colnames(fit2$vb) %in% "intrcpt"] <- "(Intercept)"
fit2[c("b", "beta", "vb")]
#> $b
#> [,1]
#> (Intercept) 0.26390547
#> factor(grade)2 -0.37269264
#> factor(grade)3 0.02484665
#> factor(grade)4 -0.01552720
#>
#> $beta
#> [,1]
#> (Intercept) 0.26390547
#> factor(grade)2 -0.37269264
#> factor(grade)3 0.02484665
#> factor(grade)4 -0.01552720
#>
#> $vb
#> (Intercept) factor(grade)2 factor(grade)3 factor(grade)4
#> (Intercept) 0.008061379 -0.008061379 -0.008061379 -0.008061379
#> factor(grade)2 -0.008061379 0.029076616 0.008061379 0.008061379
#> factor(grade)3 -0.008061379 0.008061379 0.018612667 0.008061379
#> factor(grade)4 -0.008061379 0.008061379 0.008061379 0.013458160
由reprex 包創建于 2022-04-06 (v2.0.1)
注意:如果你想在函式中重命名 colnames,你可以添加這個:
fit2 <- fit %>%
purrr::map_at(c("b", "beta", "vb"), function(x) {
rownames(x)[rownames(x) %in% "intrcpt"] <- "(Intercept)"
if ("intrcpt" %in% colnames(x)) {
colnames(x)[colnames(x) %in% "intrcpt"] <- "(Intercept)"
}
return(x)
})
uj5u.com熱心網友回復:
對要更改的成員使用lapply回圈。fit在下面的代碼中,行名稱在回圈中更改,列名稱不是因為沒有重復。
fit 變數的副本被更改,并最終與問題的結果進行比較。
suppressPackageStartupMessages(
library(metafor)
)
fit <- rma(yi~factor(grade),vi,data=dat.bangertdrowns2004)
fit2 <- fit
list_elems <- c("b", "beta", "vb")
fit2[list_elems] <- lapply(fit2[list_elems], \(x) {
rownames(x)[rownames(x) %in% "intrcpt"] <- "(Intercept)"
x
})
colnames(fit2$vb)[colnames(fit2$vb) %in% "intrcpt"] <- "(Intercept)"
rownames(fit$b)[rownames(fit$b) %in% "intrcpt"] <- "(Intercept)"
rownames(fit$beta)[rownames(fit$beta) %in% "intrcpt"] <- "(Intercept)"
rownames(fit$vb)[rownames(fit$vb) %in% "intrcpt"] <- "(Intercept)"
colnames(fit$vb)[colnames(fit$vb) %in% "intrcpt"] <- "(Intercept)"
identical(fit, fit2)
#> [1] TRUE
由reprex 包創建于 2022-04-06 (v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457213.html
上一篇:函式呼叫不正確?
