代码之家  ›  专栏  ›  技术社区  ›  iod

在dplyr::mutate中从ifelse中的另一列传输值

  •  1
  • iod  · 技术社区  · 7 年前

    dd (问题底部的dput):

    # A tibble: 6 x 2
    # Groups:   Date [5]
      Date     keeper
      <chr>    <lgl> 
    1 1/1/2018 TRUE  
    2 2/1/2018 TRUE  
    3 3/1/2018 FALSE 
    4 4/1/2018 FALSE 
    5 3/1/2018 TRUE  
    6 5/1/2018 TRUE 
    

    注意,它已按日期分组。我正在尝试创建另一列,如果组中只有一行,则该列将“keeper”变为TRUE,否则保留keeper的值。这看起来相当简单,但当我尝试这一点时,我得到了以下结果:

    dd %>% mutate(moose=ifelse(n()==1,TRUE,keeper))
    # A tibble: 6 x 3
    # Groups:   Date [5]
      Date     keeper moose
      <chr>    <lgl>  <lgl>
    1 1/1/2018 TRUE   TRUE 
    2 2/1/2018 TRUE   TRUE 
    3 3/1/2018 FALSE  FALSE
    4 4/1/2018 FALSE  TRUE 
    5 3/1/2018 TRUE   FALSE
    6 5/1/2018 TRUE   TRUE 
    

    预期产出:

      Date     keeper moose
      <chr>    <lgl>  <lgl>
    1 1/1/2018 TRUE   TRUE 
    2 2/1/2018 TRUE   TRUE 
    3 3/1/2018 FALSE  FALSE
    4 4/1/2018 FALSE  TRUE 
    5 3/1/2018 TRUE   TRUE
    6 5/1/2018 TRUE   TRUE 
    

    (注第5行)

    以下是数据帧的dput:

    dd<-structure(list(Date = c("1/1/2018", "2/1/2018", "3/1/2018", "4/1/2018", 
    "3/1/2018", "5/1/2018"), keeper = c(TRUE, TRUE, FALSE, FALSE, 
    TRUE, TRUE)), class = c("grouped_df", "tbl_df", "tbl", "data.frame"
    ), row.names = c(NA, -6L), vars = "Date", drop = TRUE, indices = list(
        0L, 1L, c(2L, 4L), 3L, 5L), group_sizes = c(1L, 1L, 2L, 1L, 
    1L), biggest_group_size = 2L, labels = structure(list(Date = c("1/1/2018", 
    "2/1/2018", "3/1/2018", "4/1/2018", "5/1/2018")), class = "data.frame", row.names = c(NA, 
    -5L), vars = "Date", drop = TRUE, indices = list(0L, 1L, 2L, 
        4L, 3L, 5L), group_sizes = c(1L, 1L, 1L, 1L, 1L, 1L), biggest_group_size = 1L, labels = structure(list(
        Date = c("1/1/2018", "2/1/2018", "3/1/2018", "3/1/2018", 
        "4/1/2018", "5/1/2018"), keeper = c(TRUE, TRUE, FALSE, TRUE, 
        FALSE, TRUE)), class = "data.frame", row.names = c(NA, -6L
    ), vars = c("Date", "keeper"), drop = TRUE, .Names = c("Date", 
    "keeper")), .Names = "Date"), .Names = c("Date", "keeper"))
    

    当我继续使用这个数据帧时,我发现如果我首先创建一个列 n add_count ,并参考我的 ifelse n() n() 给我同样的结果?

    1 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    有一种循环效应。对于 ifelse length 属于 n() 是1。第二个论点 TRUE 长度为1。因此,这方面存在不匹配 长度 第三个参数“keeper”是 长度 n() . 这造成了循环利用的不平衡。OP在附录中提到,如果创建了一列,那么问题就不存在了。原因是,一旦创建了列 长度 “n”列的值不是1,而是 n()

    dd %>% 
       mutate(moose = ifelse(rep(n(), n()) == 1, TRUE, keeper))
    # A tibble: 6 x 3
    # Groups:   Date [5]
    #  Date     keeper moose
    #  <chr>    <lgl>  <lgl>
    #1 1/1/2018 TRUE   TRUE 
    #2 2/1/2018 TRUE   TRUE 
    #3 3/1/2018 FALSE  FALSE
    #4 4/1/2018 FALSE  TRUE 
    #5 3/1/2018 TRUE   TRUE 
    #6 5/1/2018 TRUE   TRUE 
    

    而且, 属于 n() if/else

    dd %>% 
        mutate(moose = if(n()==1) TRUE else keeper)
    # A tibble: 6 x 3
    # Groups:   Date [5]
    #  Date     keeper moose
    #  <chr>    <lgl>  <lgl>
    #1 1/1/2018 TRUE   TRUE 
    #2 2/1/2018 TRUE   TRUE 
    #3 3/1/2018 FALSE  FALSE
    #4 4/1/2018 FALSE  TRUE 
    #5 3/1/2018 TRUE   TRUE 
    #6 5/1/2018 TRUE   TRUE 
    
    推荐文章