【问题标题】:mutate column based on conditions, preserving original content根据条件改变列,保留原始内容
【发布时间】:2018-10-03 11:34:32
【问题描述】:

如何在列上设置条件变异,但保留原始内容。

例如,考虑:

DF=data.frame(A=1:10, B=c("fail1", "fail2", rep(NA,8)))

DF=DF %>% mutate(B = ifelse(A<4,paste(B, "less than 4"),B))

我想要的是产生以下内容:

DF_want=data.frame(A=1:10, B=c("fail1 less than 4", "fail2 less than 4", "less than 4", rep(NA,7)))

但是因为我直接调用列B,而不是B 中的特定行,所以这不会发生。

【问题讨论】:

  • @snoram 那行不通;请看下面我的回答
  • @duckmayr 我们显然正在将不同的内容读入操作人员正在寻找的内容中。我虽然关键是preserving the original content.
  • @snoram 这也是我最初阅读问题文本时的想法(这是对文本部分最自然的阅读),但是当您运行他们发布的代码时问题变得清晰起来查看发布的预期输出。

标签: r if-statement conditional-statements tidyverse dplyr


【解决方案1】:

我看到的预期输出和实际输出之间的唯一区别是B 的第三个条目是NA less than 4 而不是less than 4。这是因为paste() 的工作方式;考虑以下几点:

paste(NA, "a")
# [1] "NA a"

所以,改为这样做:

DF %>% mutate(B = sub("NA", "", ifelse(A < 4,paste(B, "less than 4"), B)))

    A                 B
1   1 fail1 less than 4
2   2 fail2 less than 4
3   3       less than 4
4   4              <NA>
5   5              <NA>
6   6              <NA>
7   7              <NA>
8   8              <NA>
9   9              <NA>
10 10              <NA>

【讨论】:

    【解决方案2】:

    另一种可能性:

    DF %>%
      mutate(B = ifelse(A < 4 & !is.na(B), paste(B, "less than 4"), 
                        ifelse(A < 4 & is.na(B), paste("less than 4"), B))) 
    
        A                 B
    1   1 fail1 less than 4
    2   2 fail2 less than 4
    3   3       less than 4
    4   4              <NA>
    5   5              <NA>
    6   6              <NA>
    7   7              <NA>
    8   8              <NA>
    9   9              <NA>
    10 10              <NA>
    

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2020-02-25
      • 1970-01-01
      相关资源
      最近更新 更多