用R中的数字交换字符串

时间:2017-07-07 23:44:39

标签: r string vector

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

vector <- c("ABC", "DEF", "GHI", "ABC", "GHI", "ABC")

我想要做的不是在向量中使用元素ABCDEFGHI,而是希望与用户定义“交换”它们数字,这样我而不是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 这允许您将单个字符串因子级别与数值交换,反之亦然

2 个答案:

答案 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行执行查找,最后一行确保mDF的顺序相同。如果订单无关紧要,可以省略最后一行。这不使用包。

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

Try it Online

替代解决方案:

将字符串映射到用户定义的数字

    #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

Try it online