我只是想知道R是否有办法将字符串向量转换为我定义的数字。例如,假设我们有一个向量如下:
vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC")
我想要做的不是在向量中使用元素ABC
,DEF
和GHI
,而是希望与用户定义“交换”它们数字,这样我而不是ABC
而不是1
而不是DEF
我有2
,而不是GHI
我有3
1}},所以矢量现在变为
vector <- c(1, 2, 3, 1, 3, 1)
我知道有些功能与此类似,但它们并不能完全符合我的要求。例如,函数as.numeric(as.factor())
会将填充了字符串元素的向量转换为数字,这就是我想要的,但不幸的是它不允许我实际定义什么字符串值变成什么数字,这将是一个主要问题当我使用的数据集发生变化时,因为数字代表不同的字符串。
另一种替代方法是使用chartr(old = "ABC", new = "123", x)
函数(其中x
是您的数据集),这也很好,但同样背后的主要问题是“旧”字符的数量必须匹配“新”字符的数量,但事实上每个字母实例都会更改一个数字,这样如果我们用ABC
替换123
,那么每次B
都会发生2
它将永远被levels(vector)[levels(vector)=="ABC"] <- "1"
替换,这不是我想要的。
R是否有一个函数允许我用一个用户定义的数字交换向量中的字符串?
编辑:特别是(对于希望将来这样做的任何人),我使用了以下函数:git show-branch
git log --all --decorate --graph
gitk --all
这允许您将单个字符串因子级别与数值交换,反之亦然
答案 0 :(得分:4)
1)下载这不使用任何包。如果希望输出将原始字符串作为名称,则省略unname
。
map <- c(ABC = 1, DEF = 2, GHI = 3)
unname(map[vector])
## [1] 1 2 3 1 3 1
2)strapply
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)匹配这也不使用任何包。
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)")
答案 1 :(得分:0)
vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC")
vector
#[1] "ABC" "DEF" "GHI" "ABC" "GHI" "ABC"
vector=as.factor(vector)
vector
#[1] ABC DEF GHI ABC GHI ABC
vector=as.numeric(vector)
vector
#[1] 1 2 3 1 3 1
替代解决方案:
将字符串映射到用户定义的数字
#map strings to numbers
numbers <- c(1,2,3)
names <- c("ABC", "DEF", "GHI")
#store maping in data frame
df <- data.frame(names, numbers)
df
vector <-as.vector( c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC"))
vector2=c() # the numeric vector
for (i in 1:length(vector)){
id <= which(df$names == vector[i])
vector2 <= c(vector2 ,id)
}
print(vector2)
#[1] 1 2 3 1 3 1