r - 使用 `glue` 将一列中的变量替换为另一列中的内容
r - use `glue` to substitute variables in a column with whats in another column
如果我有一个用户消息列表,我会尝试保留一个数据框。我希望能够用我引用的列中的内容替换消息中的变量。
例如,这个有效:
df <- data.frame(id = rep(1:3, each = 3),
this = rep(letters[1:3], each = 3),
that = rep(letters[24:26], each = 3),
foo = rep(c("apple", "pear", "banana"), each = 3))
df %>% mutate(message = glue("{this} is {that}"))
但这不是:
library(tidyverse)
library(glue)
verbiage <- data.frame(id = 1:3,
message = c("{this} is {that}", "{foo} is something", "something is {foo}"))
verbiage
df <- data.frame(id = rep(1:3, each = 3),
this = rep(letters[1:3], each = 3),
that = rep(letters[24:26], each = 3),
foo = rep(c("apple", "pear", "banana"), each = 3))
df
df %>%
inner_join(verbiage, by = "id") %>%
mutate(message = glue(message))
我们可以使用rowwise
library(glue)
library(dplyr)
df %>%
inner_join(verbiage, by = "id") %>%
rowwise %>%
mutate(message = as.character(glue(as.character(message))))
# A tibble: 9 x 5
# Rowwise:
# id this that foo message
# <int> <fct> <fct> <fct> <chr>
#1 1 a x apple a is x
#2 1 a x apple a is x
#3 1 a x apple a is x
#4 2 b y pear pear is something
#5 2 b y pear pear is something
#6 2 b y pear pear is something
#7 3 c z banana something is banana
#8 3 c z banana something is banana
#9 3 c z banana something is banana
如果我有一个用户消息列表,我会尝试保留一个数据框。我希望能够用我引用的列中的内容替换消息中的变量。
例如,这个有效:
df <- data.frame(id = rep(1:3, each = 3),
this = rep(letters[1:3], each = 3),
that = rep(letters[24:26], each = 3),
foo = rep(c("apple", "pear", "banana"), each = 3))
df %>% mutate(message = glue("{this} is {that}"))
但这不是:
library(tidyverse)
library(glue)
verbiage <- data.frame(id = 1:3,
message = c("{this} is {that}", "{foo} is something", "something is {foo}"))
verbiage
df <- data.frame(id = rep(1:3, each = 3),
this = rep(letters[1:3], each = 3),
that = rep(letters[24:26], each = 3),
foo = rep(c("apple", "pear", "banana"), each = 3))
df
df %>%
inner_join(verbiage, by = "id") %>%
mutate(message = glue(message))
我们可以使用rowwise
library(glue)
library(dplyr)
df %>%
inner_join(verbiage, by = "id") %>%
rowwise %>%
mutate(message = as.character(glue(as.character(message))))
# A tibble: 9 x 5
# Rowwise:
# id this that foo message
# <int> <fct> <fct> <fct> <chr>
#1 1 a x apple a is x
#2 1 a x apple a is x
#3 1 a x apple a is x
#4 2 b y pear pear is something
#5 2 b y pear pear is something
#6 2 b y pear pear is something
#7 3 c z banana something is banana
#8 3 c z banana something is banana
#9 3 c z banana something is banana