【问题标题】:Another length error using dplyr mutate() and if_else()使用 dplyr mutate() 和 if_else() 的另一个长度错误
【发布时间】:2020-06-20 06:44:34
【问题描述】:

我还有另一个问题类似于上一个问题here。由于它不完全相同,因此我将其发布为一个新问题。

我正在尝试将向量作为新列添加到 tbl,但我的向量比行数短,因此我使用 if_else() 指定条件。这是一个代表和我尝试的解决方案:

library(dplyr)
library(magrittr)

data <- data.frame(
  ID = c("a100", "b100", "c100", "d100", "e100", "f100"),
  certainty = c("confirmed", "likely", "unsure", "likely", "unsure", "confirmed")
)

data %<>% as_tibble()

add <- c(1, 2)

data %<>%
  mutate(new_var =
           if_else(certainty == "likely", add, NA_real_))

这目前给了我错误Error: true must be length 6 (length of condition) or one, not 2,但据我所知,我的条件长度为2,因为sum(data$certainty == "likely") 返回[1] 2

结果应该是这样的:

  ID    certainty new_var
  <fct> <fct>       <dbl>
1 a100  confirmed      NA
2 b100  likely          1
3 c100  unsure         NA
4 d100  likely          2
5 e100  unsure         NA
6 f100  confirmed      NA

我错过了什么?再次感谢,如果这是一个菜鸟问题,我很抱歉,但我仍在努力掌握 tidyverse!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是replace的选项

    library(dplyr)
    data %>%
       mutate(new_var = replace(rep(NA_real_, n()), certainty == "likely", add))
    # A tibble: 6 x 3
    #  ID    certainty new_var
    #  <fct> <fct>       <dbl>
    #1 a100  confirmed      NA
    #2 b100  likely          1
    #3 c100  unsure         NA
    #4 d100  likely          2
    #5 e100  unsure         NA
    #6 f100  confirmed      NA
    

    这里,'add' 的 length 已知与 'certainty' 中的“可能”元素的数量相同,replace 可以根据该信息进行替换。对于if_else/ifelse/case_when,参数的长度应与条件向量的长度相同。这里,'add' 有两个元素,它不是 1 或行数。如果是1个元素,则可以循环使用


    data.table 中,我们将'data.frame' 转换为'data.table',在i 中指定逻辑条件(certainty == "likely"),并将'add' 向量分配给(:=)创建列“new_var”。默认情况下,不匹配的元素将填充NA

    library(data.table)
    setDT(data)[certainty == "likely",  new_var := add]
    

    【讨论】:

      【解决方案2】:

      这是使用基本 R 比 tidyverse 或管道更好的情况之一。

      data$new_var <- NA
      data$new_var[data$certainty == 'likely'] <- add
      data
      
      #    ID certainty new_var
      #1 a100 confirmed      NA
      #2 b100    likely       1
      #3 c100    unsure      NA
      #4 d100    likely       2
      #5 e100    unsure      NA
      #6 f100 confirmed      NA
      

      【讨论】:

        猜你喜欢
        • 2017-03-03
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多