我有一个巨大的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/