我有两个向量的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"))
有没有办法做到这一点?,感谢
答案 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