【问题标题】:paste0 and ifelse as a part of a pipe in dplyrpaste0 和 ifelse 作为 dplyr 中管道的一部分
【发布时间】:2020-06-18 20:31:18
【问题描述】:

我有以下数据框

df <- data.frame(a=c(1,2,3,4,5),b=c(6,7,8,9,10),c=c(3,NA,5,6,7))
  a  b  c
1 1  6  3
2 2  7 NA
3 3  8  5
4 4  9  6
5 5 10  7

我想为 c 列的每个值添加一个“字符串:”,除非它是 NA。

我想过使用:

library(dplyr)
df %>% select(c) %>% ifelse(is.na(.),c,(paste0("string:"))

我想要的输出是:

  a  b  c
1 1  6  string:3
2 2  7  NA
3 3  8  string:5
4 4  9  string:6
5 5 10  string:7

【问题讨论】:

  • select() 删除列。 mutate() 创建新列或更改现有列。

标签: r dplyr


【解决方案1】:

stringr::str_ctransform/mutate 一起使用怎么样

library(dplyr)
library(stringr)
df %>% 
    mutate(c = str_c('string:',c))

【讨论】:

    【解决方案2】:

    另一个基本 R 选项

    df <- within(df,c <- paste0(ifelse(is.na(c), "", "string:"),c))
    

    产量

    > df
      a  b        c
    1 1  6 string:3
    2 2  7       NA
    3 3  8 string:5
    4 4  9 string:6
    5 5 10 string:7
    

    【讨论】:

      【解决方案3】:

      我们可以使用mutate

      library(dplyr)
      
      df %>% mutate(x = ifelse(is.na(c), c, paste0("string:", c)))
      
      #  a  b  c        x
      #1 1  6  3 string:3
      #2 2  7 NA     <NA>
      #3 3  8  5 string:5
      #4 4  9  6 string:6
      #5 5 10  7 string:7
      

      这类似于在基础 R 中使用transform

      transform(df, c = ifelse(is.na(c),c,paste0("string:", c)))
      

      【讨论】:

        【解决方案4】:

        另一个简单的选择是:

        df$c <- ifelse(is.na(df$c), NA, paste0('string:', df$c))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-07
          • 2017-03-15
          • 2018-05-17
          • 2017-06-13
          • 1970-01-01
          • 2017-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多