我想在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
答案 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
进行循环,然后使用0
将replace
值更改为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
对象,并且速度会慢一些。