如何使用 R 中其他列的值格式化字符串

How to format strings using values from other column in R

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

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

知道我该怎么做吗?

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 列。

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

与 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