用R中的数字交换字符串

用R中的数字交换字符串,r,string,vector,R,String,Vector,我只是想知道R是否有办法将字符串向量转换成我定义的数字。例如,假设我们有一个向量,如下所示: vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC") 我知道有些函数可以做类似的事情,但它们不能完全满足我的要求。例如,函数as.numeric(as.factor())会将填充字符串元素的向量转换为数字,这正是我想要的,但不幸的是,它不允许我实际定义什么字符串值变成什么数字,当我使用的数据集发生变化时,这将是一个主要问题,因为数字将表示不同

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

vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC")
我知道有些函数可以做类似的事情,但它们不能完全满足我的要求。例如,函数
as.numeric(as.factor())
会将填充字符串元素的向量转换为数字,这正是我想要的,但不幸的是,它不允许我实际定义什么字符串值变成什么数字,当我使用的数据集发生变化时,这将是一个主要问题,因为数字将表示不同的字符串

另一种替代方法是使用
chartr(old=“ABC”,new=“123”,x)
函数(其中
x
是您的数据集),这也很好,但它背后的主要问题是“旧”字符的数量必须与“新”字符的数量相匹配字符,还有一个事实,即字母的每一个实例都会被一个数字所改变,因此,如果我们用
123
替换
ABC
,那么每次
B
出现时,它都会被替换为
2
,这不是我想要的

R是否有一个函数允许我用用户定义的数字交换向量中的字符串

编辑:特别是(对于将来希望这样做的任何人),我使用了以下功能:
levels(vector)[levels(vector)=“ABC”]
vector1)订阅这不使用包。如果希望输出以原始字符串作为名称,请省略
取消命名

map <- c(ABC = 1, DEF = 2, GHI = 3)
unname(map[vector])
## [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
c(1, 2, 3)[match(vector, c("ABC", "DEF", "GHI"))]
## [1] 1 2 3 1 3 1
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), ]
或者如果数字总是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)匹配这也不使用包

as.numeric(format(factor(vector, levels = c("ABC", "DEF", "GHI"), labels = 1:3)))
## [1] 1 2 3 1 3 1
c(1, 2, 3)[match(vector, c("ABC", "DEF", "GHI"))]
## [1] 1 2 3 1 3 1
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), ]
如果数字总是1,2。。。然后可以简化为:

match(vector, c("ABC", "DEF", "GHI"))
## [1] 1 2 3 1 3 1
5)数据帧此选项适用于数据帧。前两行创建数据帧,nxxt行进行查找,最后一行确保
m
DF
的顺序相同。如果顺序不重要,最后一行可以省略。这不使用任何包

as.numeric(format(factor(vector, levels = c("ABC", "DEF", "GHI"), labels = 1:3)))
## [1] 1 2 3 1 3 1
c(1, 2, 3)[match(vector, c("ABC", "DEF", "GHI"))]
## [1] 1 2 3 1 3 1
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), ]

使用
因子
并指定其
级别
这正是我需要的!谢谢,你能把它写进一个回复中,这样我就可以接受它作为答案了吗?特别是(对于将来想这样做的人来说),我使用了以下函数:
levels(vector)[levels(vector)=“ABC”]@theflowking-不需要逐个做,只要:
as.numeric(factor(vector,levels=c(“ABC”,“DEF”,“GHI”))
就可以了。或者
c(9,6,3)[factor(vector,levels=c(“ABC”,“DEF”,“GHI”))]]
如果您希望选择完全任意的数值,而不必是连续的。我意识到我上面评论中的第一位代码本质上是
as.numeric(factor())
-不同之处在于,您可以重新排列
级别=
以明确更改顺序。“as.numeric(as.factor())…是我想要的,但不幸的是,它不允许我实际定义什么字符串值变成什么数字”-OP特别指出他们想要的不是这个答案。这是最好的答案,毫无疑问,特别是第一个解决方案效果非常好,而且它更直观和直接,因为它不需要因子级别等。感谢您提供的非常详细的答案和大量的解决方案!