Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在r中重新编码数据_R_Dataframe_Data.table - Fatal编程技术网

在r中重新编码数据

在r中重新编码数据,r,dataframe,data.table,R,Dataframe,Data.table,我有一个巨大的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)

我有一个巨大的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
myd0
6   -1      -1    -1      -1
7    1   -1    1      0        0
8     -1      0        0
9    1      0         -1
10   1   -1    -1     1       -1

您可以利用以下事实:您的数据是因子,它们下面有数字索引

例如:

> as.numeric(myd$v1)
 [1]  2  2  1 NA  1  3  1 NA  1  1
数值对应于系数的
级别()

> 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

我将发布一个不同的解决方案——(跳到
data.table
以了解超快方法!)

如果要将
AA、AB、BB
重新编码为
1,0,-1
等,可以使用索引(以及系数到数值解)。这将让你有一个不同的重新编码,如果你愿意

自制重编码功能
数据表
用于提高效率 如果您的数据很大,那么我建议使用
data.table
方法,这将节省内存和时间

library(data.table)
DT <- as.data.table(myd)
as.data.table(DT[,lapply(.SD, simple_recode, new_codes = 1:-1))])
或者,甚至更有效(修改适当的级别,并避免as.data.table调用)

setattr
通过引用进行修改,因此无需复制

使用data.table和setattr的虚拟瞬时方法 正如在这个大数据集上演示的那样

#一些大数据(100列,1e6行)

big如果设置赋值使LHS具有适当的结构,则可以使用隐式强制因子值作为索引,将其转换为所需的值:

> myd[] <- c(-1,0,1)[data.matrix(myd)]
> myd
   v1 v2 v3 v4 v5
1  NA  0  0  0  1
2  -1  1  0  0 -1
3   0 NA  1  0  0
4  NA -1 -1  0 -1
5  -1  0  1 -1 NA
6   0 NA  0  1 NA
7  NA  0  1 NA -1
8   0  0  0 -1  1
9  -1 NA  1 -1 NA
10  0  1  1 NA NA
>myd[]myd
v1 v2 v3 v4 v5
1NA 0 0 1
2  -1  1  0  0 -1
3 0 NA 1 0 0
4 NA-1-10-1
5-1011-1NA
6 0 NA 0 1 NA
7 NA 0 1 NA-1
8   0  0  0 -1  1
9-1NA 1-1NA
100111NA

如果想要返回
data.frame
请使用
do.call(data.frame,lappy(myd,function(.x){-(as.numeric(.x)-2)}))
as.data.frame(lappy(myd,function(.x){-(as.numeric(.x)-2)})
好东西。我怀疑data.table策略将是闪电般的快。我确信使用
setattr
会有一种更有效的
data.table
方法,如果这可以到达
内部
数据。table
setattr
可以到达内部data.table非常棒。data.table解决方案对于我可怜的32位windows机器所能处理的数据集来说是即时的。+1个不错的解决方案。顺便说一句,这里不相关,只需提及,
:=
可以自动向系数列添加新级别,无需复制;e、 例如,
DT[,existingFactorCol:=“newlevel”]
。这在基地有点棘手。
simple_recode <- function(.x, new_codes){
  new_codes[as.numeric(.x)]
 }

as.data.frame(lapply( myd, simple_recode, new_codes = 1:-1)) 
as.data.frame(lapply(myd, factor, labels = 1:-1))
library(data.table)
DT <- as.data.table(myd)
as.data.table(DT[,lapply(.SD, simple_recode, new_codes = 1:-1))])
as.data.table(DT[, lapply(.SD, setattr, 'levels', 1:-1)])
 for(name in names(DT)){
    setattr(DT[[name]],'levels',1:-1)
     }
# some big data (100 columns, 1e6 rows)
big  <- replicate(100, factor(sample(c('AA','AB','BB', NA), 1e6, T)), simplify = F)
bigDT <- as.data.table(big)

system.time({
  for(name in names(big)){
    setattr(big[[name]],'levels',1:-1)
     }
  }))

##  user  system elapsed 
##    0        0       0
> myd[] <- c(-1,0,1)[data.matrix(myd)]
> myd
   v1 v2 v3 v4 v5
1  NA  0  0  0  1
2  -1  1  0  0 -1
3   0 NA  1  0  0
4  NA -1 -1  0 -1
5  -1  0  1 -1 NA
6   0 NA  0  1 NA
7  NA  0  1 NA -1
8   0  0  0 -1  1
9  -1 NA  1 -1 NA
10  0  1  1 NA NA