r - 使用 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)
解决方案
您忘记在示例数据中关闭引号。这是一个工作示例case_when
。case_when
我选择over没有特别的原因ifelse
,但如果你有多个条件,它更容易建立。
另请注意,如果我正确地解释了您的意图,那么在您的示例代码中,如果name_new
是NA
,name
将被分配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 创建
推荐阅读
- whmcs - WHMCS 自定义功能 - 更新付款方式错误
- r - 将函数应用于数据框(t 检验)
- c# - 在 C# 脚本任务中读取具有“FileInfo”对象内容的对象变量
- mysql - 为医院数据库中的复发患者开发 mySQL 查询
- vue.js - 如何用 jest 对 vuetify v-text field 的规则进行单元测试?
- r - 在 R 的函数中使用 Flextable
- html - 如何使一组左对齐的段落居中?
- synchronization - Vulkan 中的信号量何时用于在队列操作和主机之间插入依赖关系?
- dart - 我可以在不调用覆盖方法的情况下调用类方法吗
- asp.net-mvc - 水晶报告查看器与 localhost iis 配合良好,但在 myAsp 上在线托管时出现错误