ошибка неопределенных столбцов в R при попытке подмножества с использованием sapply - PullRequest
0 голосов
/ 22 ноября 2018

Я рвал на себе волосы в течение последнего часа, следующий код работал отлично пару часов назад, и теперь я понятия не имею, почему он больше не работает.Я искал другие вопросы, связанные с ошибкой в ​​неопределенных столбцах, но думаю, что исправил всю информацию в этих ответах.Я уверен, что есть какая-то крошечная вещь, которую я упустил из виду или случайно оставил, но я ее не вижу!

У меня есть фрейм данных как с факторными, так и с числовыми переменными, я хочу установить подмножество, чтобы сохранитьвсе факторные переменные и удалите числовые переменные, столбцы которых имеют среднее значение <0,1. </p>

. Я нашел следующий код в другом вопросе о стековом потоке, который слегка изменился, хорошо работал с моими тестовыми данными (меньший поднабор данных Iя использую для тестирования перед тем, как опробовать код на большом объекте объемом 3 ГБ)

meanfunction01 <- function(x){
    if(is.numeric(x)){
        mean(x) > 0.1
      } else {
    TRUE}
}

#then apply function to data table
Zdata <- Data1[,sapply(Data1,  meanfunction01)]

Клянусь, я использовал это несколько часов назад, затем, когда я вернулся к нему и попытался использовать его снова, он перестал работатьи теперь просто возвращает следующую ошибку:

Error in `[.data.frame`(Data1, , sapply(Data1, meanfunction01)) : 
  undefined columns selected

Я пытался изменить функцию так, чтобы она зацикливалась на нескольких объектах (у меня есть 54 объекта, к которым я хочу применить его, и я не хотелвведите их все вручную), но я не думаю, что я отредактировал оригинальную функцию, и теперь она перестала работать.

Краткое описание моих данных:

> str(Data1[1:10])
'data.frame':   11 obs. of  10 variables:
 $ Name               : Factor w/ 11688 levels "GTEX-1117F-0226-SM-5GZZ7",..: 8186 8242 8262 8270 8343 8388 8403 8621 8689 8709 ...
 $ SEX                : Factor w/ 2 levels "Female","Male": 1 2 2 1 1 2 2 1 2 1 ...
 $ AGE                : Factor w/ 6 levels "20-29","30-39",..: 4 4 1 3 3 1 3 3 3 2 ...
 $ CIRCUMSTANCES: Factor w/ 5 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Tissue.x           : Factor w/ 53 levels "Adipose_Subcutaneous",..: 7 7 7 7 7 7 7 7 7 7 ...
 $ ENSG00000223972.4  : num  0 0.0701 0.0339 0.1149 0.0549 ...
 $ ENSG00000227232.4  : num  12.5 17.2 13.1 16 15.7 ...
 $ ENSG00000243485.2  : num  0.0717 0 0.1508 0 0.061 ...
 $ ENSG00000237613.2  : num  0 0.0654 0 0.0402 0.0768 ...
 $ ENSG00000268020.2  : num  0 0.0421 0.0611 0 0 ...

1 Ответ

0 голосов
/ 23 ноября 2018

Так что, если ваша единственная проблема - это изменение класса целочисленных переменных в вашем data.frame, но у вас есть много столбцов (> 10000), вы можете рассмотреть возможность преобразования вашего data.frame в data.table.Ваш код будет выглядеть так:

library(data.table)
Data1<-data.table(Data1) #or if you have your data in csv document just use fread instead of read.csv which will automatically give you a data.table.

Тогда вам просто нужно найти целочисленные столбцы, используя это:

which(sapply(Data1,is.integer))

Поместить его в целом с помощью команд data.table:

Data1[,which(sapply(Data1,is.integer)):=lapply(.SD,as.numeric),.SDcols=which(sapply(Data1,is.integer))]

Обратите внимание, что вам не нужно присваивать вышеуказанную строку кода чему-либо, поскольку data.table использует указатели, что делает его намного быстрее, чем data.frame или tibbles объектов.Таким образом, выполнение приведенной выше строки будет эффективно обновлять ваш объект Data1.Классы других нецелочисленных столбцов (т.е. коэффициенты) останутся без изменений.

Пожалуйста, обновите, если у вас есть дополнительные вопросы, но это должно ответить на ваш комментарий.Желаем удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...