![](/img/trans.png)
[英]How to apply a function to multiple columns to create multiple new columns in 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.