我只是想知道 R 是否有办法将字符串向量转换为我定义的数字。例如,假设我们有一个向量如下:
vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC")
我想做的不是拥有元素 ABC
, DEF
,和GHI
在向量中,我想将它们与用户定义的数字“交换”,这样而不是 ABC
在向量中我有 1
,而不是 DEF
我有2
,而不是 GHI
我有3
,所以向量现在变成
vector <- c(1, 2, 3, 1, 3, 1)
我知道有些函数可以执行与此类似的操作,但它们并不完全符合我的要求。例如,函数 as.numeric(as.factor())
会将填充字符串元素的向量转换为数字,这就是我想要的,但不幸的是,它不允许我实际定义什么字符串值变成什么数字,当我使用的数据集发生变化时,这将是一个主要问题数字代表不同的字符串。
另一种替代方法是使用chartr(old = "ABC", new = "123", x)
函数(其中 x
是你的数据集)这也很好,但它背后的主要问题又是“旧”字符的数量必须与"new"字符的数量匹配,而且每个实例字母将被数字更改,例如,如果我们替换 ABC
与 123
然后每次B
发生时它将始终被替换为 2
这不是我想要的。
R 是否有一个函数可以让我将向量中的字符串与用户定义的数字交换?
编辑:特别是(对于任何希望将来这样做的人),我使用了以下函数:levels(vector)[levels(vector)=="ABC"] <- "1"
这允许您将各个字符串因子级别与数值交换,反之亦然
最佳答案
1) 下标 这不使用任何包。如果您希望输出将原始字符串作为名称,请省略 unname
。
map <- c(ABC = 1, DEF = 2, GHI = 3)
unname(map[vector])
## [1] 1 2 3 1 3 1
2) 绑带
library(gsubfn)
strapply(vector, ".*", list(ABC = 1, DEF = 2, GHI = 3), simplify = TRUE)
## [1] 1 2 3 1 3 1
3)因素不涉及任何包。
as.numeric(format(factor(vector, levels = c("ABC", "DEF", "GHI"), labels = 1:3)))
## [1] 1 2 3 1 3 1
或者如果数字始终为 1、2...,则可以简化为:
as.numeric(factor(vector, levels = c("ABC", "DEF", "GHI")))
## [1] 1 2 3 1 3 1
如果您省略levels=
,那么它将按字母顺序首先分配给1,依此类推。因此,如果该分配正确,则它会进一步简化为:
as.numeric(factor(vector))
## [1] 1 2 3 1 3 1
4) match 这也不使用任何包。
c(1, 2, 3)[match(vector, c("ABC", "DEF", "GHI"))]
## [1] 1 2 3 1 3 1
如果数字始终为 1、2...,则可以简化为:
match(vector, c("ABC", "DEF", "GHI"))
## [1] 1 2 3 1 3 1
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), ]
有几种流行的面向数据框架的包可以在这里使用来代替上面的最后两行。这些解决方案中未使用 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)")
关于r - 在 R 中交换字符串与数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44981090/