使用 r 中的 for 循环重新调整具有给定不同参考水平的许多变量
Relevel many variables with given different reference level using for loop in r
我需要更改 a、b、d 和 e 变量的参考水平。变量 a 的参考水平应为 3,变量 b、d 和 e 的参考水平应为 2。这可以单独完成。但是想立即执行或使用 for 循环。以下是我编写的代码。但是,显示错误消息“'relevel' 仅适用于(无序)因子”。
tr <- data.frame(a = c(3, 2, 3, 3, 1), b = c(4, 3, 2, 2, 1), c = c(1, 2, 3, 2, 1),
d = c(1, 3, 1, 2, 2), e = c(1, 2, 0, 1, 2))
#convert to factor type
tr <- tr %>% mutate_if(is.numeric, as.factor)
# Relevel factors
col_set <- list(1, c(2, 4, 5)) # column index to relevel
r <- c("3", "2") # referencing level
for (i in seq_along(col_set)){
tr[col_set[[i]]] <- relevel(tr[col_set[[i]]], r[i])
}
**Error in relevel.default(tr[col_set[[i]]], r[i]) :
'relevel' only for (unordered) factors**
您的索引设置不正确。请记住 tr[col_set[[i]]]
可能 return 一个数据框(例如当 i == 2 时),因此您无法对其重新排序。您需要挑选出各个列并重新排序。这需要一个内部循环。
library(dplyr)
tr <- data.frame(a = c(3, 2, 3, 3, 1), b = c(4, 3, 2, 2, 1), c = c(1, 2, 3, 2, 1),
d = c(1, 3, 1, 2, 2), e = c(1, 2, 0, 1, 2))
tr <- tr %>% mutate_if(is.numeric, as.factor)
col_set <- list(1, c(2, 4, 5)) # column index to relevel
r <- c("3", "2") # referencing level
for (i in seq_along(col_set))
for(j in seq_along(tr[col_set[[i]]]))
tr[col_set[[i]]][[j]] <- relevel(tr[col_set[[i]]][[j]], r[i])
结果如下所示:
tr
#> a b c d e
#> 1 3 4 1 1 1
#> 2 2 3 2 3 2
#> 3 3 2 3 1 0
#> 4 3 2 2 2 1
#> 5 1 1 1 2 2
我们可以这样检查因子水平:
as.list(tr)
#> $a
#> [1] 3 2 3 3 1
#> Levels: 3 1 2
#>
#> $b
#> [1] 4 3 2 2 1
#> Levels: 2 1 3 4
#>
#> $c
#> [1] 1 2 3 2 1
#> Levels: 1 2 3
#>
#> $d
#> [1] 1 3 1 2 2
#> Levels: 2 1 3
#>
#> $e
#> [1] 1 2 0 1 2
#> Levels: 2 0 1
由 reprex package (v0.3.0)
于 2020 年 6 月 15 日创建
您可以使用 Map
在特定列上使用 relevel
而不是 for
循环。
tr[unlist(col_set)] <- Map(relevel, tr[unlist(col_set)], rep(r, lengths(col_set)))
str(tr)
#'data.frame': 5 obs. of 5 variables:
# $ a: Factor w/ 3 levels "3","1","2": 1 3 1 1 2
# $ b: Factor w/ 4 levels "2","1","3","4": 4 3 1 1 2
# $ c: Factor w/ 3 levels "1","2","3": 1 2 3 2 1
# $ d: Factor w/ 3 levels "2","1","3": 2 3 2 1 1
# $ e: Factor w/ 3 levels "2","0","1": 3 1 2 3 1
我需要更改 a、b、d 和 e 变量的参考水平。变量 a 的参考水平应为 3,变量 b、d 和 e 的参考水平应为 2。这可以单独完成。但是想立即执行或使用 for 循环。以下是我编写的代码。但是,显示错误消息“'relevel' 仅适用于(无序)因子”。
tr <- data.frame(a = c(3, 2, 3, 3, 1), b = c(4, 3, 2, 2, 1), c = c(1, 2, 3, 2, 1),
d = c(1, 3, 1, 2, 2), e = c(1, 2, 0, 1, 2))
#convert to factor type
tr <- tr %>% mutate_if(is.numeric, as.factor)
# Relevel factors
col_set <- list(1, c(2, 4, 5)) # column index to relevel
r <- c("3", "2") # referencing level
for (i in seq_along(col_set)){
tr[col_set[[i]]] <- relevel(tr[col_set[[i]]], r[i])
}
**Error in relevel.default(tr[col_set[[i]]], r[i]) :
'relevel' only for (unordered) factors**
您的索引设置不正确。请记住 tr[col_set[[i]]]
可能 return 一个数据框(例如当 i == 2 时),因此您无法对其重新排序。您需要挑选出各个列并重新排序。这需要一个内部循环。
library(dplyr)
tr <- data.frame(a = c(3, 2, 3, 3, 1), b = c(4, 3, 2, 2, 1), c = c(1, 2, 3, 2, 1),
d = c(1, 3, 1, 2, 2), e = c(1, 2, 0, 1, 2))
tr <- tr %>% mutate_if(is.numeric, as.factor)
col_set <- list(1, c(2, 4, 5)) # column index to relevel
r <- c("3", "2") # referencing level
for (i in seq_along(col_set))
for(j in seq_along(tr[col_set[[i]]]))
tr[col_set[[i]]][[j]] <- relevel(tr[col_set[[i]]][[j]], r[i])
结果如下所示:
tr
#> a b c d e
#> 1 3 4 1 1 1
#> 2 2 3 2 3 2
#> 3 3 2 3 1 0
#> 4 3 2 2 2 1
#> 5 1 1 1 2 2
我们可以这样检查因子水平:
as.list(tr)
#> $a
#> [1] 3 2 3 3 1
#> Levels: 3 1 2
#>
#> $b
#> [1] 4 3 2 2 1
#> Levels: 2 1 3 4
#>
#> $c
#> [1] 1 2 3 2 1
#> Levels: 1 2 3
#>
#> $d
#> [1] 1 3 1 2 2
#> Levels: 2 1 3
#>
#> $e
#> [1] 1 2 0 1 2
#> Levels: 2 0 1
由 reprex package (v0.3.0)
于 2020 年 6 月 15 日创建您可以使用 Map
在特定列上使用 relevel
而不是 for
循环。
tr[unlist(col_set)] <- Map(relevel, tr[unlist(col_set)], rep(r, lengths(col_set)))
str(tr)
#'data.frame': 5 obs. of 5 variables:
# $ a: Factor w/ 3 levels "3","1","2": 1 3 1 1 2
# $ b: Factor w/ 4 levels "2","1","3","4": 4 3 1 1 2
# $ c: Factor w/ 3 levels "1","2","3": 1 2 3 2 1
# $ d: Factor w/ 3 levels "2","1","3": 2 3 2 1 1
# $ e: Factor w/ 3 levels "2","0","1": 3 1 2 3 1