将列中的值替换为与具有匹配项的向量相对应的值

Replace values from a column with value corresponding to vector with matches

我有一个数据框,在 "roles" 列中,每一行的值为 "students" 或 "teacher"。我想相应地用 "st" 或 "te" 替换这些值。

roles_complete <- c("students","teacher")
roles_standard <- c("st", "te")
data$roles <- stri_replace_all(data$roles, regex= roles_complete, roles_standard)

奇怪的是,这只会改变一些值。

    roles
1   st
2   students
3   teacher
4   te
5   st
6   students
7   teacher
8   te
9   st
10  students
11  teacher
12  te

我在 stri_replace 中插入的条件显然做错了,但文档不是很清楚。

你可以试试

data$roles <- replace(data$roles,roles_complete,roles_standard)

那个是stringi包裹吗?在我看来,只有连续 "students" 和 "teacher" 的序列(向量)被替换。所以当连续有"students"和"students"时,保持不变。

如果您可以切换到包 stringr,函数 str_replace_all() 允许您准确定义如何替换匹配的模式:

library(stringr)
data <- c("students", "teacher", "students", "teacher")
str_replace_all(data, c("students" = "st", "teacher" = "te"))

所以对于你的情况:

data$roles <- str_replace_all(data$roles, c("students" = "st", "teacher" = "te"))

通常 R 将字符向量解释为因子。如果您的数据集中是这种情况:

data <- data.frame(roles = sample(c("students","teacher"), 12, replace = TRUE))
levels(data$roles)
# [1] "students" "teacher" 
levels(data$roles) <- c("st", "te")
levels(data$roles)
# [1] "st" "te"

dplyr 包裹

您可以在 dplyr 中使用 recode()

library(dplyr)

df %>%
  mutate(roles = recode(roles, "students" = "st", "teacher" = "te"))

如果您已经为变量分配了角色,那么您可以将命名向量作为输入。

roles_complete <- c("students", "teacher")
roles_standard <- c("st", "te")

df %>%
  mutate(roles = recode(roles, !!!setNames(roles_standard, roles_complete)))

stringr 包裹

str_replace_all() in stringr 也可以将命名向量作为输入。

library(stringr)

df$roles <- str_replace_all(df$roles, setNames(roles_standard, roles_complete))

base解决方案

df$role <- factor(df$role, labels = c("st", "te"))

最简单的 Base R 方法,假设每个级别都是学生或教师,如 OP 中所述:

levels(data$roles) <- substr(levels(data$roles), 1, 2)

数据

data <-
  data.frame(roles = sample(c("students", "teacher"), 12, replace = TRUE))