用R中的数字交换字符串
我只是想知道R是否有办法将字符串向量转换成我定义的数字。例如,假设我们有一个向量,如下所示:用R中的数字交换字符串,r,string,vector,R,String,Vector,我只是想知道R是否有办法将字符串向量转换成我定义的数字。例如,假设我们有一个向量,如下所示: vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC") 我知道有些函数可以做类似的事情,但它们不能完全满足我的要求。例如,函数as.numeric(as.factor())会将填充字符串元素的向量转换为数字,这正是我想要的,但不幸的是,它不允许我实际定义什么字符串值变成什么数字,当我使用的数据集发生变化时,这将是一个主要问题,因为数字将表示不同
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特别指出他们想要的不是这个答案。这是最好的答案,毫无疑问,特别是第一个解决方案效果非常好,而且它更直观和直接,因为它不需要因子级别等。感谢您提供的非常详细的答案和大量的解决方案!