将字符转换为数字

时间:2014-04-13 19:17:51

标签: r

我有两个向量的data.frame

df <- data.frame(G1=c("b","a","e","d","c"),
                 G2=c("c","d","e","b","a"))

您可以看到两个矢量具有相同的字符,但顺序不同。我想将它们转换成数字,然后比较它们。

要将G2与G1进行比较,G1必须是参考,因此输出将为:

df2 <- data.frame(G1=c("1","2","3","4","5"),
                 G2=c("5","4","3","1","2"))

有没有办法做到这一点?,感谢

4 个答案:

答案 0 :(得分:4)

这似乎给出了你的输出:

df <- data.frame(G1=c("b","a","e","d","c"),
                 G2=c("c","d","e","b","a"))

G1 <- as.character(as.numeric(factor(df$G1,levels=unique(df$G1))))
G2 <- as.character(as.numeric(factor(df$G2,levels=unique(df$G1))))
df2<-data.frame(G1,G2)
df2
#   G1 G2
# 1  1  5
# 2  2  4
# 3  3  3
# 4  4  1
# 5  5  2

请注意,df2显示为数字,但实际上是字符。另请注意,在定义G2时,我们会使用df$G1的级别。这是关键。

答案 1 :(得分:3)

试试这个:

df2 <- data.frame(G1 = match(df$G1, unique(df$G1)))
df2$G2 <- match(df$G2, unique(df$G1))
df2
#  G1 G2
#1  1  5
#2  2  4
#3  3  3
#4  4  1
#5  5  2

答案 2 :(得分:0)

加载CRAN包:hash

require("hash")

df <- data.frame(G1=c("b","a","e","d","c"),
                 G2=c("c","d","e","b","a"),
                 stringsAsFactors= FALSE)

确定要被视为散列键的列号(例如:如下所示的第1列)

hashkey <- df[,1]

为列的长度设置唯一的哈希值(例如:如下所示的第1列)

hashval <- seq(1, length(df[,1]))

使用哈希函数

创建哈希表(关联数组)
h <- hash (keys = hashkey, 
           values = hashval
          )

&#34;的GetValues&#34;函数将提取数据框中每条记录的值

功能&#34;值&#34;是散列包的一部分

getvalues <- function(x) {

  vals <- values(h[x], 
                 USE.NAMES = FALSE)
  return(vals)

}

申请&#34; getvalues&#34;函数到数据框中的每条记录

您需要手动更改&#34; df&#34;的列号。数据框具有应用getvalues函数的效果。 (例如:列号1和2如下)

df[,1:2] <- data.frame(lapply(df[,1:2],
                              FUN = function(x) { sapply(x,FUN = getvalues )}), 
                       stringsAsFactors = FALSE)

df

  G1 G2
1  1  5
2  2  4
3  3  3
4  4  1
5  5  2

str(df)
'data.frame':   5 obs. of  2 variables:
 $ G1: int  1 2 3 4 5
 $ G2: int  5 4 3 1 2

如果您需要数据框中的值为字符类型,请使用此形式的getvalues函数。

getvalues <- function(x) {
  vals <- values(h[x], 
                 USE.NAMES = FALSE)
  return(as.character(vals))
}

str(df)
'data.frame':   5 obs. of  2 variables:
 $ G1: chr  "1" "2" "3" "4" ...
 $ G2: chr  "5" "4" "3" "1" ...

HTH

答案 3 :(得分:0)

非常感谢你的所有建议, 这就是我对原始data.frame所做的事情:

df$G1.num <- 1:length(df$G1)
df$G2.num <-  match(df$G2,df$G1)
df

通过这种方式,我得到了一个很好的输出,在那里我可以看到原始术语,加上它们的数字名称:

  G1 G2 G1.num G2.num
1  b  c      1      5
2  a  d      2      4
3  e  e      3      3
4  d  b      4      1
5  c  a      5      2