如何使用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,2
2 %s + %s equal %s        2,4

我需要这样的结果:

             words    arguments         combined
1 %s + %s equal %s        1,2    1 + 1 equal 2
2 %s + %s equal %s        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,2 1 + 1 equal 2
#2 %s + %s equal %s     2,2,4 2 + 2 equal 4

我们在arguments上拆分","值,使用do.call将它们作为sprintf的单独参数传递,并创建combined字符串。 x[2]中的apply指向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,2 1 + 1 equal 2
2 %s + %s equal %s     2,4 2 + 2 equal 4

R为底:

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

非常类似于Ronak的解决方案,但使用了ABC-XYZ-20200914-PIA-03_05_20200914132900.txt|END_OF_PARAM|进行简化:

data.table