2016-09-07 70 views
0

很新的R,我想某些子选择列以确定其NA的0设置多列NA的重视--R

到目前为止我有:

col_names1 <- c('a','b','c') 
col_names2 <- c('e','f','g') 
col_names <- c(col_names1, col_names2) 
data = fread('data.tsv', sep="\t", header= FALSE,na.strings="NA", 
     stringsAsFactors=TRUE, 
     colClasses=my_col_Classes 
     ) 
setnames(data, col_names) 
data[col_names2][is.na(data[col_names2])] <- 0 

但我一直得到错误

错误在`[.data.table`(`* tmp *`,column_names2):当我是一个data.table(或字符向量)时,x必须被键入(即排序,并标记为排序),所以data.table知道哪些列加入并利用o f x被排序。先拨打setkey(x,...),看到?setkey。

我相信这个错误是说我有错误的顺序,但我不知道我是怎么做的?

+1

只是一个简短的提示,但'fread'返回一个数据表。既然你是R的新手,我可以想象你实际上想要一个数据框。如果是这样,在'fread'内指定'data.table = FALSE'。另外,请记住,缺失的值与0不一样...并且根据你在做什么,这可能会导致偏见。 – Laterow

回答

3

您可以data.table分配:=

data <- data.table(a = c(2, NA, 3, 5), b = c(NA,2,3,4), c = c(2,5,NA, 6)) 
fix_columns <- c('a','b')  
fix_fun <- function(x) ifelse(is.na(x), 0 , x) 

data[,(fix_columns):=lapply(.SD, fix_fun), .SDcols=fix_columns] 

附:做您不能从data.table中选择列,如data[col_names2]。如果你想按字符向量选择它们,一种方法是:data[, col_names2, with = F]

+0

[避免'ifelse'](http://stackoverflow.com/questions/16275149/does-ifelse-really-calculate-both-of-its-vectors-every-time-is-it-slow)。查看上面评论中链接的问题以获得更好的方法。 – MichaelChirico