一种基于R中频率的字符向量到整数的有效转换方法

一种基于R中频率的字符向量到整数的有效转换方法,r,data-manipulation,R,Data Manipulation,我有一个仅由“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

我有一个仅由“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%个病例,因为它不应该在我们的研究中发生)。< / P> < P>使用这个:

ag.encode <- function(x)
{
  result <- x == "a"
  if( sum(result) > length(result) %/% 2 ) 1-result else as.numeric(result)
}

您可以将字符向量转换为
因子。这个解决方案更通用,因为您不需要知道用于创建x的2个字符的名称

y <- as.integer(factor(x))-1
if(sum(y)>length(y)/2) y <- as.integer(!y)

y长度(y)/2)y这样确实更快。为什么?
%chin%
(仅适用于字符向量)来自
数据。表
比%
=
中的
%快。所以,做
x%chin%“a”
应该会让它快一点。这个比@Ferdinand.kraft的解决方案慢一点,但还是比我的快一点。谢谢。首选
因子(x,级别=名称(排序(表(x),递减=真))-1L
。可用于任何级别。@flodel与仅
1
相比,
1L
将带来什么好处?我在核心R函数中经常看到这一点。@flodel在您的注释中有一个额外的括号。它还提供了一条警告消息,结果是一个NAS向量,它应该是
as.integer(因子(x,levels=names(排序(表(x),递减=TRUE))-1L
as.integer
返回一个
integer
向量,因此您希望减去
1L
(一个整数)而不是
1
(一个数字)以保留
整数
向量。使用整数而不是数字,在很多方面都是有益的。整数使用更少的内存,一些使用它们的操作速度更快,而且它们更健壮,因为它们不受浮点问题的影响。
y <- as.integer(factor(x))-1
if(sum(y)>length(y)/2) y <- as.integer(!y)