我有一个巨大的1000 x 100000数据框,像下面这样重新编码为数值。

myd <- data.frame (v1 = sample (c("AA", "AB", "BB", NA), 10, replace = T),
                   v2 = sample (c("CC", "CG", "GG", NA), 10, replace = T),
                   v3 = sample (c("AA", "AT", "TT", NA) , 10, replace = T),
                   v4 = sample (c("AA", "AT", "TT", NA) , 10, replace = T),
                   v5 = sample (c("CC", "CA", "AA", NA) , 10, replace = T)
                   )
myd
     v1   v2   v3   v4   v5
1    AB   CC <NA> <NA>   AA
2    AB   CG   TT   TT   AA
3    AA   GG   AT   AT   CA
4  <NA> <NA> <NA>   AT <NA>
5    AA <NA>   AA <NA>   CA
6    BB <NA>   TT   TT   CC
7    AA   GG   AA   AT   CA
8  <NA>   GG <NA>   AT   CA
9    AA <NA>   AT <NA>   CC
10   AA   GG   TT   AA   CC

每个变量都可能具有四个唯一值。
unique(myd$v1)

[1] AB   AA   <NA> BB
Levels: AA AB BB

unique(myd$v2)

[1] CC   CG   GG   <NA>
  Levels: CC CG GG

这样的唯一值可以是任何组合,但是可以由两个字母组成(NA除外)。例如,第一种情况下的“A”,“B”将组合为“AA”,“AB”,“BB”。这些的数字代码分别为1、0,-1。类似地,对于第二种情况,字母“C”,“G”表示“CC”,“CG”,“GG”,因此数字代码分别为1、0,-1。因此,上述myd需要重新编码为:
 myd
         v1   v2   v3    v4      v5
    1    0   1     <NA>  <NA>    1
    2    0   0     -1    -1      1
    3    1   -1     0    0       0
    4  <NA>  <NA>  <NA>   0     <NA>
    5    1  <NA>    1  < NA>      0
    6   -1  <NA>    -1    -1      -1
    7    1   -1    1      0        0
    8  <NA>   -1   <NA>   0        0
    9    1  <NA>    0    <NA>     -1
    10   1   -1    -1     1       -1

最佳答案

您可以利用数据是因子的事实,这些因子在其下具有数字索引。

例如:

> as.numeric(myd$v1)
 [1]  2  2  1 NA  1  3  1 NA  1  1

数值对应于因子的levels():
> levels(myd$v1)
[1] "AA" "AB" "BB"

所以1 == AA,2 == AB,3 == BB ...依此类推。

因此,您可以简单地将数据转换为数字,然后应用必要的数学运算来按需要缩放数据。因此,我们可以减去2,然后乘以-1,以获得您的结果:
(sapply(myd, as.numeric) - 2) * -1
#-----
      v1 v2 v3 v4 v5
 [1,]  0  1 NA NA  1
 [2,]  0  0 -1 -1  1
 [3,]  1 -1  0  0  0
 [4,] NA NA NA  0 NA
 [5,]  1 NA  1 NA  0
 [6,] -1 NA -1 -1 -1
 [7,]  1 -1  1  0  0
 [8,] NA -1 NA  0  0
 [9,]  1 NA  0 NA -1
[10,]  1 -1 -1  1 -1

关于在r中重新编码数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12462888/

10-12 16:31
查看更多