【问题标题】:How to format strings using values from other column in R如何使用 R 中其他列的值格式化字符串
【发布时间】:2020-09-14 09:42:30
【问题描述】:

我需要使用以逗号分隔的其他列中的值进行一些字符串格式化。假设我有一个这样的数据框:

words <- c('%s + %s equal %s', '%s + %s equal %s')
arguments <- c('1,1,2', '2,2,4')
df <- data.frame(words, arguments)
df
             words    arguments
1 %s + %s equal %s        1,1,2
2 %s + %s equal %s        2,2,4

我需要这样的结果:

             words    arguments         combined
1 %s + %s equal %s        1,1,2    1 + 1 equal 2
2 %s + %s equal %s        2,2,4    2 + 2 equal 4

知道我该怎么做吗?

【问题讨论】:

    标签: r string dataframe string-formatting


    【解决方案1】:

    dplyr:

    library(dplyr)
    df %>% mutate(combined = eval(parse(text = sprintf("sprintf('%s', %s)", words, arguments))))
    
                 words arguments      combined
    1 %s + %s equal %s     1,1,2 1 + 1 equal 2
    2 %s + %s equal %s     2,2,4 2 + 2 equal 4
    

    使用基础 R:

    df$combined <- apply(df, 1, function(x) eval(parse(text = sprintf("sprintf('%s', %s)", x[1], x[2]))))
    df
    
                 words arguments      combined
    1 %s + %s equal %s     1,1,2 1 + 1 equal 2
    2 %s + %s equal %s     2,2,4 2 + 2 equal 4
    

    【讨论】:

      【解决方案2】:

      words 列非常适合sprintf。尝试以下方法:

      df$combined <- apply(df, 1, function(x) do.call(sprintf, 
                             c(as.list(strsplit(x[2], ',')[[1]]), fmt = x[[1]])))
      df
      
      #             words arguments      combined
      #1 %s + %s equal %s     1,1,2 1 + 1 equal 2
      #2 %s + %s equal %s     2,2,4 2 + 2 equal 4
      

      我们在"," 上拆分arguments 值,使用do.call 将它们作为sprintf 的单独参数传递并创建combined 字符串。 apply 中的x[2] 指的是arguments 列,而x[1]words 列。

      【讨论】:

        【解决方案3】:

        与 Ronak 的解决方案非常相似,但使用了一些 data.tablepurrr 来简洁:

        library(purrr)
        library(data.table)
        
        df$combind <- map_chr(
          seq_len(nrow(df)), 
          ~do.call(sprintf, c(fmt = df$words[.], tstrsplit(df$arguments[.], ",")))
        )
        
        #              words arguments       combind
        # 1 %s + %s equal %s     1,1,2 1 + 1 equal 2
        # 2 %s + %s equal %s     2,2,4 2 + 2 equal 4
        

        【讨论】:

          猜你喜欢
          • 2017-11-03
          • 1970-01-01
          • 2017-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-30
          • 2013-03-17
          • 1970-01-01
          相关资源
          最近更新 更多