2016-09-07 2 views
0

Совершенно новое R, я пытаюсь подвыбор определенные столбцы для того, чтобы установить их, чтобы 0.установка нескольких столбцов NA, чтобы ценить --R

NA до сих пор у меня есть:

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 (или символ вектор), х должен быть ключом (т.е. отсортирован , и, отмеченные как отсортированные), поэтому 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] 

P.S. Вы не можете выбирать столбцы из 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

Смежные вопросы