将列中的值替换为与具有匹配项的向量相对应的值
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))
我有一个数据框,在 "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))