首页 > 解决方案 > 使用 ifelse 和 is.na 重新编码变量

问题描述

我想根据另一个不是 NA 的变量重新编码一个变量。在下面的示例中,我想name替换为new_name每次new_name不是 NA。我想这很简单,但是我在示例中尝试的解决方案不起作用。感谢您的帮助。

df <- structure(list(id = c(321, 452, 564, 678), name = c("Red", "White", "Black", "Blue"), 
                new_name = c("Pink", NA, NA, "Light blue")), row.names = c(NA, -4L), 
                class = c("tbl_df", "tbl", "data.frame"))

ifelse(is.na(df$new_name), 
       df$name == df$new_name, 
       df$name == df$name)

标签: r

解决方案


您忘记在示例数据中关闭引号。这是一个工作示例case_whencase_when我选择over没有特别的原因ifelse,但如果你有多个条件,它更容易建立。

另请注意,如果我正确地解释了您的意图,那么在您的示例代码中,如果name_newNAname将被分配name_new,与您在文本中描述的相反。

library(dplyr)
#> Warning: package 'dplyr' was built under R version 4.0.3
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df <- structure(list(id = c(321, 452, 564, 678), name = c("Red", "White", "Black", "Blue"), 
                new_name = c("Pink", NA, NA, "Light blue")), row.names = c(NA, -4L), 
                class = c("tbl_df", "tbl", "data.frame"))


df %>% 
  mutate(name = case_when(
    !is.na(new_name) ~ new_name,
    !is.na(name) ~ name
  ))
#> # A tibble: 4 x 3
#>      id name       new_name  
#>   <dbl> <chr>      <chr>     
#> 1   321 Pink       Pink      
#> 2   452 White      <NA>      
#> 3   564 Black      <NA>      
#> 4   678 Light blue Light blue



# Alternative solution with `coalesce` (suggested by Martin Gal in comments)
df %>% 
  mutate(name = coalesce(name, new_name))
#> # A tibble: 4 x 3
#>      id name  new_name  
#>   <dbl> <chr> <chr>     
#> 1   321 Red   Pink      
#> 2   452 White <NA>      
#> 3   564 Black <NA>      
#> 4   678 Blue  Light blue

reprex 包(v0.3.0)于 2021-08-24 创建


推荐阅读