我有一个仅由'a'或'g'组成的字符向量,我想根据频率将它们转换为整数,即更频繁的一个应编码为0,另一个为1,例如:
set.seed(17)
x = sample(c('g', 'a'), 10, replace=T)
x
# [1] "g" "a" "g" "a" "g" "a" "g" "g" "a" "g"
x[x == names(which.max(table(x)))] = 0
x[x != 0] = 1
x
# [1] "0" "1" "0" "1" "0" "1" "0" "0" "1" "0"
这样可行,但我想知道是否有更有效的方法。
(我们不必在此考虑50%-50%的情况,因为在我们的研究中不应该这样做。)
答案 0 :(得分:3)
使用此:
ag.encode <- function(x)
{
result <- x == "a"
if( sum(result) > length(result) %/% 2 ) 1-result else as.numeric(result)
}
如果您想将标签保留在factor
结构中,请改用:
ag.encode2factor <- function(x)
{
result <- x == "a"
if( sum(result) > length(result) %/% 2 )
{
factor(2-result, labels=c("a","g"))
}
else
{
factor(result+1, labels=c("g","a"))
}
}
答案 1 :(得分:3)
您可以将角色向量转换为factor
角色向量。此解决方案更通用,因为您不需要知道用于创建x的2个字符的名称。
y <- as.integer(factor(x))-1
if(sum(y)>length(y)/2) y <- as.integer(!y)