这是我的数据:
df <- tibble::tribble(
~A, ~B,
"C", "G",
"D", "H",
"E", "I",
"F", "J")
value1 <- "D"
value2 <- "C"
而且,在变量A中,我想用“m”和“n”替换D和C,就像这样,但它不起作用!
df %>% mutate(X = A %>% str_replace_all(c(value1 = "m", value2 = "n")))
我想要的输出是:
df %>% mutate(X = A %>% str_replace_all(c("D" = "m", "C" = "n")))
但是我没有手动提供“D”和“C”,而是想以编程方式提供这些,使用value1和value2符合......
我该怎么做?
答案 0 :(得分:2)
您可以尝试使用setNames
设置m
和n
的名称,如:
library(dplyr)
library(stringr)
df %>% mutate(X = A %>% str_replace_all(setNames(c("m","n"), c(value1, value2))))
# A tibble: 4 x 3
# A B X
# <chr> <chr> <chr>
#1 C G n
#2 D H m
#3 E I E
#4 F J F
然后检查它是否等于您想要的结果:
identical(
df %>% mutate(X = A %>% str_replace_all(c("D" = "m", "C" = "n"))),
df %>% mutate(X = A %>% str_replace_all(setNames(c("m","n"), c(value1, value2)))))
#[1] TRUE
我还包括您使用的其他软件包:dplyr和stringr
答案 1 :(得分:1)
您可以考虑创建一个命名向量并将其用作替换向量。
replacementVector <- c("m","n")
names(replacementVector) <- c("D","C")
现在,使用replacementVector
链中的dplyr
和ifelse
作为:
df %>% mutate(X = ifelse(is.na(replacementVector[A]), A, replacementVector[A]))
# # A tibble: 4 x 3
# A B X
# <chr> <chr> <chr>
# 1 C G n
# 2 D H m
# 3 E I E
# 4 F J F
数据:强>
library(tidyverse)
df <- tibble::tribble(
~A, ~B,
"C", "G",
"D", "H",
"E", "I",
"F", "J")
答案 2 :(得分:1)
如果将所有值放在同一个向量中,则可以在字符串和替换上进行矢量化,只需运行
即可df %>% mutate(X = A %>% str_replace_all(c("C","D"), c("m","n")))
答案 3 :(得分:1)
我们可以使用chartr
df %>%
mutate(X = chartr('DC', 'mn', A))
# A tibble: 4 x 3
# A B X
# <chr> <chr> <chr>
#1 C G n
#2 D H m
#3 E I E
#4 F J F