问题描述
我需要使用其他列中的值(以逗号分隔)来进行一些字符串格式化。假设我有一个像这样的数据框:
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