簡體   English   中英

如何跨多個列應用 ifelse function 並在 R 中創建新列

[英]How to apply ifelse function across multiple columns and create new columns in R

我想在我的數據集的多個列中應用 ifelse function 並創建新的“重新評分”列。 這是一個示例數據集:

data = data.frame(year = "2021",
                  month = sample(x = c(1:12), size = 10, replace = TRUE),
                  C1 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C2 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C3 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C4 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C5 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C6 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C7 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C8 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C9 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE),
                  C10 = sample(x = c('Off', 'Yes'), size = 10, replace = TRUE))

我想在以 C 開頭的所有行中應用這樣的 function:

rescored = data %>%
  mutate(T1 = ifelse(C1 == "Off", 1,
                     ifelse(C1 == "Yes", 0, NA)))

我的真實數據集有 50 行或更多行需要應用此 function。 有沒有一種簡單的方法可以做到這一點? 我已經嘗試在 dplyr 中使用“交叉”的變體,如下所示,但沒有成功。 我敢肯定還有一個“應用”選項。

rescored = data %>%
  mutate(across(C1:C50, ifelse(~ .x == "Off", 1,
                               ifelse(~.x == "Yes", 0, NA))))

以下選項似乎有效。 我不確定是否有更優雅的方式來做到這一點。 在第二步中重命名變量似乎並不理想。

rescore <- function(x, na.rm = FALSE) (ifelse(x == "Off", 1, ifelse(x == "Yes", 0, NA)))
                                       
data %>% 
  mutate_at(c(as.vector(paste0("C", 1:50))), funs(scr = rescore)) %>%
  rename_at(vars(ends_with("_scr")), funs(paste("scr", 1:50, sep = "_")))

只需這樣做(您必須在 function 語句的開頭使用twiddle ~ ,而不是在每個參數之前。)

data %>%
  mutate(across(starts_with('C'), ~ifelse( .x == "Off", 1,
                               ifelse(.x == "Yes", 0, NA))))

   year month C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
1  2021     1  1  0  0  1  1  0  0  1  1   1
2  2021    12  1  1  0  0  1  1  1  0  1   0
3  2021    10  1  0  1  0  0  1  0  0  1   1
4  2021     3  0  1  1  1  0  1  0  0  0   1
5  2021    11  1  0  1  1  1  0  1  0  0   0
6  2021    12  1  0  0  1  1  1  0  0  1   0
7  2021     4  0  0  0  1  1  0  1  0  1   0
8  2021     2  0  0  0  1  0  0  0  0  1   0
9  2021     3  0  0  1  0  0  1  0  0  1   0
10 2021     9  1  0  0  0  0  0  1  0  0   0

或者這個,如果你想保留原始列


data %>%
  mutate(across(starts_with('C'), ~ifelse( .x == "Off", 1, 0), .names = 'scr_{sub("C", "", .col)}'))
#>    year month  C1  C2  C3  C4  C5  C6  C7  C8  C9 C10 scr_1 scr_2 scr_3 scr_4
#> 1  2021     7 Yes Yes Yes Off Yes Off Off Yes Yes Yes     0     0     0     1
#> 2  2021    11 Off Yes Yes Yes Yes Yes Off Yes Yes Yes     1     0     0     0
#> 3  2021     1 Yes Yes Off Off Yes Yes Yes Off Yes Yes     0     0     1     1
#> 4  2021     5 Yes Off Off Yes Yes Yes Yes Off Yes Yes     0     1     1     0
#> 5  2021     6 Off Off Yes Yes Off Off Off Yes Off Yes     1     1     0     0
#> 6  2021    12 Yes Yes Yes Off Off Yes Yes Yes Off Yes     0     0     0     1
#> 7  2021     1 Off Off Off Off Yes Off Off Off Yes Yes     1     1     1     1
#> 8  2021     1 Yes Yes Yes Off Off Yes Yes Off Off Yes     0     0     0     1
#> 9  2021     8 Off Yes Off Yes Off Off Yes Yes Yes Yes     1     0     1     0
#> 10 2021    10 Off Yes Off Yes Yes Off Off Yes Off Off     1     0     1     0
#>    scr_5 scr_6 scr_7 scr_8 scr_9 scr_10
#> 1      0     1     1     0     0      0
#> 2      0     0     1     0     0      0
#> 3      0     0     0     1     0      0
#> 4      0     0     0     1     0      0
#> 5      1     1     1     0     1      0
#> 6      1     0     0     0     1      0
#> 7      0     1     1     1     0      0
#> 8      1     0     0     1     1      0
#> 9      1     1     0     0     0      0
#> 10     0     1     1     0     1      1

代表 package (v2.0.0) 於 2021 年 5 月 15 日創建

暫無
暫無

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

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