напишите формулу пастой

в настоящее время у меня есть фрагмент кода, который выглядит как этот

as.formula(paste0('Y~',paste('factor','(', names(te)[w],')', sep="",collapse="+")))

ответ (Y) и предикторы TRY1, Y2, UYP21 и GHT9 являются именами столбцов фрейма данных te, а w — это вектор, который индексирует имена столбцов, поскольку для модели выбираются только определенные столбцы из фрейма данных.

Моя проблема в том, что этот код запишет формулу для всех предикторов как factor(). Как я могу написать кусок, который решит, что для w = 12 (12-й столбец te) это должен быть не фактор, а as.numeric. В более общем случае он должен проверить класс столбца фрейма данных с помощью class(), а затем решить, использовать ли фактор или числовой. Желаемый результат

Y~factor(TRY1)+factor(TRY2)+factor(UYP21)+as.numeric(GHT9)

в то время как текущий код производит

Y~factor(TRY1)+factor(TRY2)+factor(UYP21)+factor(GHT9)

предоставленный ответ работает очень хорошо, но проблема в том, что он действительно не должен быть as.numeric не только numeri


person wery    schedule 12.01.2015    source источник
comment
Вы можете использовать sapply(y, class) или sapply(y, is.factor), чтобы найти класс.   -  person akrun    schedule 12.01.2015
comment
думаю, что это потенциально другая проблема, так как это можно сделать единственным способом, я полагаю, с помощью какого-то оператора if?....   -  person wery    schedule 12.01.2015
comment
@akrun спасибо за комментарий .... я думаю, что могу определить тип столбца, но я не знаю, как бы я реализовал вставку множителя if как X и вставку числового значения как бит Y. Какие-либо предложения? Был бы очень признателен   -  person wery    schedule 12.01.2015
comment
Лучше показать пример набора данных, точно такой же, как тот, который я показал в вашем предыдущем посте. Это даст вам больше откликов.   -  person akrun    schedule 12.01.2015
comment
Я сомневаюсь, что если GHT9 является числовым, то зачем вам указывать as.numeric(GHT9)   -  person akrun    schedule 12.01.2015
comment
Возможно do.call(paste(stuff))   -  person Carl Witthoft    schedule 12.01.2015
comment
Можете ли вы объяснить свою настоящую цель? Почему вы хотите сделать это в первую очередь? Вероятно, есть лучший способ решить проблему.   -  person Dason    schedule 12.01.2015
comment
@Dason прав: скорее всего, вы можете сделать это, вызвав формулу с индексами факторов, а не их именами (используйте переменную list для хранения ваших данных)   -  person Carl Witthoft    schedule 12.01.2015
comment
Если ваши столбцы являются фактором в data.frame, вам не нужно использовать factor() в формуле. Вы импортировали их как персонажей? Если это так, самым простым решением будет просто преобразовать столбцы ваших символов в фактор, поскольку именно так вы хотите, чтобы они вели себя. Не используйте формулу для решения проблем с данными; просто исправьте свои данные.   -  person MrFlick    schedule 12.01.2015


Ответы (1)


Это не лучшая кодировка, но, возможно, она помогает.

forFormula <- NULL
for(i in 1:dim(te)[2]){ 
  one <- paste0(class(te[,i]), "(", colnames(te)[i], ")")
  forFormula <- c(forFormula, one)
}
forFormula <- as.formula(paste("Y ~", (paste(forFormula, collapse="+"))))
person darwin    schedule 12.01.2015
comment
привет ... это работает, единственная проблема в том, что это должно быть as.numeric (), а не только числовое .... не могли бы вы отменить это, может быть? - person wery; 13.01.2015