簡體   English   中英

使用 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' only for (unordered) factors”。

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]]]可能會返回一個數據幀(例如當 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 日創建

代替for循環,您可以使用Map在特定列上使用relevel

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM