我有如下数据框
monkey = data.frame(girl = 1:10, kn = NA, boy = 5)
我想逐步理解以下代码含义
monkey %>%
mutate(t = ifelse(is.na(kn),.[,grepl('a',names(.))],ll))
提前感谢大家的支持。
我有如下数据框
monkey = data.frame(girl = 1:10, kn = NA, boy = 5)
我想逐步理解以下代码含义
monkey %>%
mutate(t = ifelse(is.na(kn),.[,grepl('a',names(.))],ll))
提前感谢大家的支持。
在我看来,这不是好的代码,但我会尝试解释它在做什么。
is.na(kn)
(在 的上下文中monkey
)返回该列中的每个值是否为 的逻辑向量NA
,
with(monkey, is.na(kn))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
.
in的使用是.[grepl(*)]
指调用开始时的当前数据mutate
;使用 dplyr-canonicalcur_data()
会更完整(例如,考虑到以前.
无法识别的变异列,这里不是一个因素)。我相信这段.[*]
代码试图根据当前数据动态选择一列。
为什么这个不好: 1.这里
没有名称包含的列"a"
;2. 可能有多个列名称包含"a"
,这意味着yes=
参数 to将在新列ifelse
中生成嵌套框架;t=
3..[,*]
如果原始框架是 base-Rdata.frame
或者它是 tibble-variant ,则行为会发生变化tbl_df
:参见monkey[,1]
vs tibble(monkey)[,1]
。
no=
参数是指ll
未定义的对象。这应该(直观地)失败Error: object 'll' not found
或类似,但由于所有test=
论点都是正确的,no=
因此不需要它,因此它没有被评估。考虑ifelse(c(TRUE, TRUE), 1:2, stop("oops"))
(无错误)与ifelse(c(TRUE, FALSE), 1:2, stop("oops"))
.
最终,此代码的防御性不够安全(base-vs-tibble 变体),其意图尚不清楚。
我在使用时的建议dplyr
是使用dplyr::if_else
而不是 base R's ifelse
。一方面,ifelse
有一些问题和限制(例如,如何防止 ifelse() 将 Date 对象转换为数字对象);另一方面,if_else
保护您免受诸如您的问题中的模棱两可、不一致的结果代码的影响。