簡體   English   中英

根據 R 中的單個其他列 NA 值將兩列中的數值替換為 NA

[英]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 ,我們可以對BC應用一個簡單的ifelse語句,使用across並在它們滿足條件時用NA替換(即DNA )。

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

一個基本的 R 解決方案,帶有Mapis.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.

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