data.table用NA替换值

时间:2015-08-01 12:15:50

标签: r data.table

我想在0的每一栏中将NA替换为data.table

library(data.table)
dt1 <- data.table(V1=0:2, V2=2:0)
dt1

   V1 V2
1:  0  2
2:  1  1
3:  2  0

dt1==0
       V1    V2
[1,]  TRUE FALSE
[2,] FALSE FALSE
[3,] FALSE  TRUE

我试过这个

dt1[dt1==0] 
Error in `[.data.table`(dt1, dt1 == 0) : 
  i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please let datatable-help know if you'd like this, or add your comments to FR #1611.

还试过这个

dt1[dt1==0, .SD :=NA] 

被修改

部分sessionInfo()

R version 3.2.1 (2015-06-18)
Platform: i686-pc-linux-gnu (32-bit)
Running under: Ubuntu 14.04.2 LTS

data.table_1.9.4

2 个答案:

答案 0 :(得分:12)

您可以针对多列尝试set。由于避免了.[data.table的开销,它会更快

for(j in seq_along(dt1)){
         set(dt1, i=which(dt1[[j]]==0), j=j, value=NA)
}
dt1
#   V1 V2
#1: NA  2
#2:  1  1
#3:  2 NA

或另一个选项是使用lapply进行循环,然后使用0replace值更改为NA

dt1[, lapply(.SD, function(x) replace(x, which(x==0), NA))]

或者我们可以利用一些关系算术运算将0值转换为NA。

 dt1[, lapply(.SD, function(x) (NA^!x) *x)]

(NA^!x)*x的工作方式是将!x即每个列的逻辑TRUE / FALSE向量(其中TRUE对应于0值)转换为NA,并通过执行{转换为1 {1}}。我们乘以x值将1替换为对应的x值,而NA将保持不变。

或类似于NA^!x的语法

base R

但是这种方法对于大数据可能效率不高。表格 is.na(dt1) <- dt1==0 可能是一个逻辑矩阵,而且@Roland在注释中提到数据集将被复制。我会使用基于dt1==0或效率更高的lapply来获取更大的数据集。

答案 1 :(得分:3)

server { listen 80; listen [::]:80 default_server ipv6only=on; server_name www.site.com; root /var/www/site; index index.php; error_log /var/log/nginx/site.error.log; access_log /var/log/nginx/site.access.log; location ~ \.php$ { fastcgi_connect_timeout 5s; fastcgi_read_timeout 10s; fastcgi_pass unix:/var/run/php5-fpm.sock; #fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_index index.php; include fastcgi_params; #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } 为我工作。

dt1[dt1==0] <- NA

如Roland所述,这确实会复制dt1[dt1==0] <- NA dt1 ## V1 V2 ##1: NA 2 ##2: 1 1 ##3: 2 NA 对象,并且速度会慢一些。