我遇到了一個問題,NA 值沒有按照我需要/期望的方式處理dplyr::ifelse,我想知道是否有人可以幫忙?
在此示例中,我嘗試根據將另一個名為 ( ) 的列的結果與其他 3 個列 ( 和 ) 中的每一個進行匹配pair來填充一個新列 (名為)。因此,例如,如果與 column 相同,則列值應對應于 column 中的值。這主要是有效的,除了......min_colABCmin_colApairA1
問題:一些行在NA應該回傳一個值時回傳,但有些行回傳一個值(正確),即使NA該行中有一個存在。它似乎取決于NA在行中的位置。
例子
library(dplyr)
# create a dataframe with some `NA` values
df <- data.frame(A = c(NA, 5:11, NA, NA), A1 = letters[1:10],
B = c(1, NA, 20, NA, 22:26, NA), B1 = letters[11:20],
C = c(6:7, NA, 0, NA, 2:5, NA), C1 = letters[16:25])
#identify the column (either `A`, `B`, or `C`) which has the minimum value
df$min_col <- pmin(df$A, df$B, df$C, na.rm=T)
# find the letter pair (from column `A1`, `B1` or `C1`) which goes with the minimum value
# so for example if the minimum value is the same as column `A` then the `pair` column should be the same as column `A1`.
df$pair <- ifelse(df$min_col == df$A, df$A1,
ifelse(df$min_col == df$B, df$B1,
ifelse(df$min_col == df$C, df$C1, NA)))
這給出了以下輸出

當我希望他們回傳一個字母時,第 1、4 和 9 行在NA名為的列中回傳一個。pair相反,第 5 行確實給出了正確的輸出,即使該行還包含一個NA. 我無法弄清楚問題所在。
我不想NA用 0 替換 s ,因為我的真實資料框實際上有很多不同類的列,包括 dates ,所以它有點復雜。
非常感謝您的任何建議!
uj5u.com熱心網友回復:
ifelse不是 dplyr 函式,if_else是。但是,case_when與多個嵌套ifelse函式相比,這是一個不錯的選擇。
這會給你預期的輸出嗎?
library(dplyr)
df |>
mutate(min_col = pmin(A, B, C, na.rm = T),
pair = case_when(min_col == A ~ A1,
min_col == B ~ B1,
min_col == C ~ C1,
TRUE ~ NA_character_))
#> A A1 B B1 C C1 min_col pair
#> 1 NA a 1 k 6 p 1 k
#> 2 5 b NA l 7 q 5 b
#> 3 6 c 20 m NA r 6 c
#> 4 7 d NA n 0 s 0 s
#> 5 8 e 22 o NA t 8 e
#> 6 9 f 23 p 2 u 2 u
#> 7 10 g 24 q 3 v 3 v
#> 8 11 h 25 r 4 w 4 w
#> 9 NA i 26 s 5 x 5 x
#> 10 NA j NA t NA y NA <NA>
使用reprex v2.0.2創建于 2022-10-28
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522778.html
