Проблемы с получением правильного класса объекта. R

#r #function #class

#r #функция #класс

Вопрос:

Я создал небольшую функцию для обработки фрейма данных, чтобы иметь возможность использовать функцию:

 preprocessCore::normalize.quantiles()
  

Поскольку normalize.quintles() может использовать только объект matrixc, и мне нужно изменить порядок моих данных, я создаю небольшую функцию, которая принимает определенный столбец (переменную) в определенном фрейме данных и выполняет следующее:

 normal<-function(boco,df){
  df_p1<-subset(df,df$Plate==1)
  df_p2<-subset(df,df$Plate==2)
  mat<-cbind(df_p1$boco,df_p2$boco)
  norm<-preprocessCore::normalize.quantiles(mat)
  df_1<-data.frame(var_1=c(norm[,1],norm[,2]),well=c(df_p1$well,df_p2$well))
  return(df_1)
}
  

Однако «mat» должен быть матрицей, но, похоже, cbind() не выполняет свою работу, поскольку я получаю следующую ошибку:

 normal(antitrombina_FI,Six_Plex_IID)

Error in preprocessCore::normalize.quantiles(mat) : 
  Matrix expected in normalize.quantiles 
  

Итак, ясно, что cbind() не создает матрицу. Я не понимаю, почему это происходит.

Комментарии:

1. cbind является методом класса S3. Существует метод для обоих matrix , и data.frame поэтому, если ввод является data.frame выходом, также будет data.frame . Вы могли бы попробовать использовать as.matrix на своем mat объекте.

2. Если вам нужна дополнительная помощь, чем хорошая рекомендация Оливера, пожалуйста, поделитесь достаточным количеством данных, чтобы сделать небольшой воспроизводимый пример, демонстрирующий проблему.

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

Ответ №1:

Скорее всего, вы связываете два нулевых объекта вместе, получая NULL, который не является матрицей. Если ваши df объекты data.frame , то df_p1$boco интерпретируется как «извлечь переменную с именем boco «, а не «извлечь переменную, имя которой является значением объекта, имеющего символ boco «. Я подозреваю, что ваши данные не содержат переменной с буквальным именем «boco», поэтому df_p1$boco оценивается как NULL.

Если вы хотите извлечь столбец, который задается в качестве значения формального аргумента boco в функции normal() , тогда вам следует использовать [[ , а не $ :

 normal<-function(boco,df){
  df_p1<-subset(df,df$Plate==1)
  df_p2<-subset(df,df$Plate==2)
  mat<-cbind(df_p1[[boco]],df_p2[[boco]])
  norm<-preprocessCore::normalize.quantiles(mat)
  df_1<-data.frame(var_1=c(norm[,1],norm[,2]),well=c(df_p1$well,df_p2$well))
  return(df_1)
}
  

Комментарии:

1. О, мне нравится этот ответ. Очень хорошая догадка, бьюсь об заклад, вы правы!

Ответ №2:

Спасибо за вашу помощь, bcarlsen. Однако я обнаружил некоторые ошибки:

Во-первых, я считаю, что вам нужно ввести кавычки в

 mat<-cbind(df_p1[["boco"]],df_p2[["boco"]])
  

Если я запускаю этот скрипт вне функции, он работает идеально:

 df_p1<-subset(Six_Plex_IID,Six_Plex_IID$Plate==1)
df_p2<-subset(Six_Plex_IID,Six_Plex_IID$Plate==2)
mat<-cbind(df_p1[["antitrombina_FI"]],df_p2[["antitrombina_FI"]])
norm<-preprocessCore::normalize.quantiles(mat)
  

Однако, если я введу это сейчас в функцию и попытаюсь запустить ее как функцию:

 normal<-function(boco,df){
  df_p1<-subset(df,df$Plate==1)
  df_p2<-subset(df,df$Plate==2)
  mat<-cbind(df_p1[["boco"]],df_p2[["boco"]])
  norm<-preprocessCore::normalize.quantiles(mat)
  df_1<-data.frame(var_1=c(norm[,1],norm[,2]),well=c(df_p1$well,df_p2$well))
  return(df_1)
}
normal(antitrombina_FI,Six_Plex_IID)
  

Я получаю то же сообщение об ошибке:

 Error in preprocessCore::normalize.quantiles(mat) : 
  Matrix expected in normalize.quantiles
  

Я совершенно не понимаю, почему это происходит, почему вне функции я получаю матрицу и почему внутри функции нет.

Спасибо

Комментарии:

1.Не заключайте boco в кавычки [[ внутри функции. normal(antitrombina_FI,Six_Plex_IID) является normal(boco = antitrombina_FI, df = Six_Plex_IID) ; т. е. antitrombina_FI сопоставляется с формальным аргументом boco normal() . Значением символа boco в вызове вашей функции является вектор символов «antitrombina_FI». df_p1[["boco"]] означает «получить переменную с именем «boco» из объекта df_p1″. Это значение равно НУЛЮ, поскольку в df_p1 нет переменной с именем «boco». у df_p1 есть переменная с именем «antitrombina_FI», которая является значением объекта boco в области действия функции.

2. df_p1[["boco"]] = получить переменную df_p1 с именем «boco». Если в этом нет переменной с буквальным именем «boco» df_p1 , возвращает значение NULL. df_p1[[boco]] = получить переменную of df_p1 с именем, равным значению объекта boco . Если boco в доступной среде нет объекта, это вызовет исключение. Внутри функции есть объект с символом boco , потому boco что это имя одного из формальных аргументов. cbind(NULL, NULL) возвращает значение NULL. normalize.quantiles(cbind(NULL, NULL)) выдает исключение, поскольку NULL не является матрицей.