[英]Replace numerical value in two columns with NA based on a single other column NA value in R
我已將我的 df 簡化為:
A <- c("a", "b", "c", "d", "e", "f", "g", "NA", "h", "I")
B <- c(NA, 2, 3, 4, NA, NA, 5, 6, 8, NA)
C <- c(NA, 9, 8, 4, 5, 7, 5, 6, NA, NA)
D <- c(NA, 1, NA, 3, NA, 5, NA, NA, 8, NA)
E <- c(1,2,3,4,5,6,7,8,9,10)
df <- data.frame(A, B, C, D, E)
我想創建一個通用代碼來根據 D 列的 NA 值更改 B 列和 C 的數值。生成的 df2 將是:
A <- c("a", "b", "c", "d", "e", "f", "g", "NA", "h", "I")
B <- c(NA, 2, NA, 4, NA, NA, NA, NA, 8, NA)
C <- c(NA, 9, NA, 4, NA, 7, NA, NA, NA, NA)
D <- c(NA, 1, NA, 3, NA, 5, NA, NA, 8, NA)
E <- c(1,2,3,4,5,6,7,8,9,10)
df2 <- data.frame(A, B, C, D, E)
對於我不起作用的代碼,到目前為止我已經嘗試了下面的代碼,這給了我“未使用的參數(as.numeric(B))”的錯誤:
df2 <- df %>% na_if(is.na(D), as.numeric(B)) %>%
na_if(is.na(D), as.numeric(C))
非常感謝任何幫助。 我無法安裝庫(naniar)所以請不要使用 replace_with_na_at 的解決方案。
謝謝!
使用dplyr
,我們可以對B
和C
應用一個簡單的ifelse
語句,使用across
並在它們滿足條件時用NA
替換(即D
是NA
)。
library(dplyr)
output <- df %>%
mutate(across(B:C, ~ ifelse(is.na(D), NA, .x)))
Output
A B C D E
1 a NA NA NA 1
2 b 2 9 1 2
3 c NA NA NA 3
4 d 4 4 3 4
5 e NA NA NA 5
6 f NA 7 5 6
7 g NA NA NA 7
8 NA NA NA NA 8
9 h 8 NA 8 9
10 I NA NA NA 10
測試
identical(output, df2)
# [1] TRUE
data.table
A <- c("a", "b", "c", "d", "e", "f", "g", "NA", "h", "I")
B <- c(NA, 2, 3, 4, NA, NA, 5, 6, 8, NA)
C <- c(NA, 9, 8, 4, 5, 7, 5, 6, NA, NA)
D <- c(NA, 1, NA, 3, NA, 5, NA, NA, 8, NA)
E <- c(1,2,3,4,5,6,7,8,9,10)
df <- data.frame(A, B, C, D, E)
library(data.table)
cols <- c("B", "C")
setDT(df)[is.na(D), (cols) := NA][]
#> A B C D E
#> 1: a NA NA NA 1
#> 2: b 2 9 1 2
#> 3: c NA NA NA 3
#> 4: d 4 4 3 4
#> 5: e NA NA NA 5
#> 6: f NA 7 5 6
#> 7: g NA NA NA 7
#> 8: NA NA NA NA 8
#> 9: h 8 NA 8 9
#> 10: I NA NA NA 10
由reprex package (v2.0.1) 創建於 2022-03-02
一個基本的 R 解決方案,帶有Map
和is.na<-
。
A <- c("a", "b", "c", "d", "e", "f", "g", "NA", "h", "I")
B <- c(NA, 2, 3, 4, NA, NA, 5, 6, 8, NA)
C <- c(NA, 9, 8, 4, 5, 7, 5, 6, NA, NA)
D <- c(NA, 1, NA, 3, NA, 5, NA, NA, 8, NA)
E <- c(1,2,3,4,5,6,7,8,9,10)
df <- data.frame(A, B, C, D, E)
df[c("B", "C")] <- Map(\(x, y) {
is.na(x) <- is.na(y)
x
}, df[c("B", "C")], df["D"])
df
#> A B C D E
#> 1 a NA NA NA 1
#> 2 b 2 9 1 2
#> 3 c NA NA NA 3
#> 4 d 4 4 3 4
#> 5 e NA NA NA 5
#> 6 f NA 7 5 6
#> 7 g NA NA NA 7
#> 8 NA NA NA NA 8
#> 9 h 8 NA 8 9
#> 10 I NA NA NA 10
由reprex package (v2.0.1) 創建於 2022-03-01
dplyr
和dplyr
的解決方案,但相同的is.na<-
。
library(dplyr)
df %>%
mutate(across(B:C, \(x) {is.na(x) <- is.na(D); x}))
#> A B C D E
#> 1 a NA NA NA 1
#> 2 b 2 9 1 2
#> 3 c NA NA NA 3
#> 4 d 4 4 3 4
#> 5 e NA NA NA 5
#> 6 f NA 7 5 6
#> 7 g NA NA NA 7
#> 8 NA NA NA NA 8
#> 9 h 8 NA 8 9
#> 10 I NA NA NA 10
由reprex package (v2.0.1) 創建於 2022-03-01
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.