0

我有如下数据框

monkey = data.frame(girl = 1:10, kn = NA, boy = 5)

我想逐步理解以下代码含义

monkey %>%
  mutate(t = ifelse(is.na(kn),.[,grepl('a',names(.))],ll))

提前感谢大家的支持。

4

1 回答 1

1

在我看来,这不是好的代码,但我会尝试解释它在做什么。

  • 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保护您免受诸如您的问题中的模棱两可、不一致的结果代码的影响。

于 2022-02-23T14:49:23.393 回答