如何使用 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.table
和 purrr
来简化:
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
我需要使用其他列中的值进行一些字符串格式化,这些值以逗号分隔。假设我有一个这样的数据框:
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.table
和 purrr
来简化:
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