Сумирайте колони с подобни имена

Имам цифров вектор 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