3

'a' または 'g' のみで構成される文字のベクトルがあります。頻度に基づいて整数に変換したいと考えています。つまり、頻度の高いものは 0 に、もう 1 つは 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% のケースをここで考慮する必要はありません。これは、私たちの研究では決して起こらないはずです.)

4

2 に答える 2

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"))
  }
}
于 2013-08-04T15:44:11.280 に答える
3

文字ベクトルを 1 に変換できますfactor。このソリューションは、x を作成するために使用される 2 文字の名前を知る必要がないという意味で、より一般的です。

y <- as.integer(factor(x))-1
if(sum(y)>length(y)/2) y <- as.integer(!y)
于 2013-08-04T15:56:24.953 に答える