Сумма столбцов с похожими именами

У меня есть числовой вектор varс именами (вывод из predict.cv.glmnet)

var<-c(5.74,0.00,0.15,0.00,0.04,0.00,0.00,0.00,1.81,0.00)
names(var)<- cbind("(Intercept)","as.factor(holiday)1","as.factor(season)2","as.factor(season)3","as.factor(season)4","as.factor(weathersit)2", "as.factor(weathersit)3","windspeed","temp","hum")

(Intercept)    as.factor(holiday)1     as.factor(season)2     as.factor(season)3     as.factor(season)4      as.factor(weathersit)2 
   5.74              0.00                    0.15                       0.00                  0.04                   0.00 
as.factor(weathersit)3              windspeed                   temp                    hum 
           0.00                       0.00                      1.81                    0.00 

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

"(Intercept)"        "as.factor(season)"         "temp"   

У меня также есть переменная с именами факторов fac:

fac<-c("as.factor(holiday)","as.factor(season)","as.factor(weathersit)")


 "as.factor(holiday)"    "as.factor(season)"     "as.factor(weathersit)"

и думал агрегировать факторы с похожими именами, опуская их уровни, и проверять, равна ли сумма агрегированных факторов> 0, но я не могу ее кодировать.


person mknut    schedule 12.02.2016    source источник
comment
Пожалуйста, рассмотрите возможность создания воспроизводимого примера   -  person Sotos    schedule 12.02.2016


Ответы (1)


Я поиграл с which и регулярными выражениями:

var<-c(5.74,0.00,0.15,0.00,0.04,0.00,0.00,0.00,1.81,0.00)
names(var)<- cbind("(Intercept)","as.factor(holiday)1","as.factor(season)2","as.factor(season)3","as.factor(season)4","as.factor(weathersit)2", "as.factor(weathersit)3","windspeed","temp","hum")

X <- names(var)[which(var!=0)]
n <- grep( "as[.]factor.*", X )
X[n] <- gsub( ")[0-9]+$", ")", X[n] )

X <- unique(X)
X

#[1] "(Intercept)"       "as.factor(season)" "temp"  

which выбирает ненулевые компоненты. grep используется для нахождения индексов факторов. Затем gsub удаляет уровни факторов.

person mra68    schedule 12.02.2016
comment
Спасибо за ответ. Это делает работу для предоставленного примера. Знаете ли вы, как я мог бы использовать gsub, чтобы обобщить это на случаи, когда уровни факторов не являются числовыми? Предположим, что имена моих переменных теперь такие: names(var)<- cbind("(Intercept)","as.factor(holiday)1","as.factor(season)winter","as.factor(season)spring","as.factor(season)summer","as.factor(weathersit)2", "as.factor(weathersit)3","windspeed","temp","hum") - person mknut; 12.02.2016
comment
Хорошо, я попробовал X[n] <- gsub( ").+$", ")", X[n] ), и, похоже, все работает. - person mknut; 12.02.2016