在 R 中交换字符串与数字

The*_*ing 2 string r vector

我只是想知道 R 是否有办法将字符串向量转换为我定义的数字。例如,假设我们有一个向量如下:

vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC")
Run Code Online (Sandbox Code Playgroud)

我想要做的不是在向量中包含元素ABC, DEF, ,而是GHI将它们与用户定义的数字“交换”,这样,而不是ABC在向量中包含 I have 1,而不是DEFI have 2,而不是GHI我有3,所以向量现在变成

vector <- c(1, 2, 3, 1, 3, 1)
Run Code Online (Sandbox Code Playgroud)

我知道有些函数可以执行与此类似的操作,但它们并不完全符合我的要求。例如,该函数as.numeric(as.factor())会将填充字符串元素的向量转换为数字,这就是我想要的,但不幸的是它不允许我实际定义什么字符串值变成什么数字,当数据集我'时这将是一个主要问题m 使用更改,因为数字代表不同的字符串。

另一种替代方法是使用该chartr(old = "ABC", new = "123", x)函数(x您的数据集在哪里),这也很好,但其背后的主要问题又是“旧”字符的数量必须与“新”字符的数量匹配,而且事实是字母的每个实例都会被数字更改,这样,如果我们替换ABC123,那么每次B出现时,它总是会被替换为2这不是我想要的。

R 是否有一个函数可以让我将向量中的字符串与用户定义的数字交换?

编辑:特别是(对于任何希望将来这样做的人),我使用了以下函数:levels(vector)[levels(vector)=="ABC"] <- "1"这允许您将单个字符串因子级别与数值交换,反之亦然

G. *_*eck 5

1) 下标这不使用包。unname如果您希望输出将原始字符串作为名称,请省略。

map <- c(ABC = 1, DEF = 2, GHI = 3)
unname(map[vector])
## [1] 1 2 3 1 3 1
Run Code Online (Sandbox Code Playgroud)

2) 绑带

library(gsubfn)
strapply(vector, ".*", list(ABC = 1, DEF = 2, GHI = 3), simplify = TRUE)
## [1] 1 2 3 1 3 1
Run Code Online (Sandbox Code Playgroud)

3)factor 这个不涉及任何包。

as.numeric(format(factor(vector, levels = c("ABC", "DEF", "GHI"), labels = 1:3)))
## [1] 1 2 3 1 3 1
Run Code Online (Sandbox Code Playgroud)

或者如果数字总是 1, 2, ... 那么它可以简化为:

as.numeric(factor(vector, levels = c("ABC", "DEF", "GHI")))
## [1] 1 2 3 1 3 1
Run Code Online (Sandbox Code Playgroud)

如果您省略,levels=那么它将按字母顺序将第一个分配给 1,依此类推。因此,如果该分配正确,则它会进一步简化为:

as.numeric(factor(vector))
## [1] 1 2 3 1 3 1
Run Code Online (Sandbox Code Playgroud)

4) match这也不使用任何包。

c(1, 2, 3)[match(vector, c("ABC", "DEF", "GHI"))]
## [1] 1 2 3 1 3 1
Run Code Online (Sandbox Code Playgroud)

如果数字始终为 1, 2, ...,则可以简化为:

match(vector, c("ABC", "DEF", "GHI"))
## [1] 1 2 3 1 3 1
Run Code Online (Sandbox Code Playgroud)

5) data.frame这个适用于数据框。前两行创建数据帧,nxxt 行进行查找,最后一行确保其m顺序与DF. 如果顺序无关紧要,则可以省略最后一行。这不使用任何包。

mapDF <- data.frame(let = c("ABC", "DEF", "GHI"), num = 1:3)
DF <- data.frame(let = vector, order = seq_along(vector))

m <- merge(DF, mapDF, all.x = TRUE, all.y = FALSE)
m[ order(m$order), ]
Run Code Online (Sandbox Code Playgroud)

有几种流行的面向数据框架的包可以在这里用来代替上面的最后两行。这些解决方案中未使用该色谱柱,因此可以在以下解决方案中order省略该色谱柱。DF

library(dplyr)
DF %>% left_join(mapDF)

library(data.table)
data.table(mapDF)[DF, on = "let"]

library(sqldf)
sqldf("select * from DF left join mapDF using (let)")
Run Code Online (Sandbox Code Playgroud)