2015-11-05 59 views
2

我需要在公式的每個變量上執行循環。我的公式是:R - 訪問公式變量

> lr$formula 
target ~ grupoAntig + nu_seguros_1TRUNC + cd_sexo + grupoEdad + 
    vl_limite_aeQU + vl_ltd_6QU + Revolv3 + nu_servicios_1TRUNC + 
    fl_cliente_hit + nu_resumen_6 + fl_rv 

我想運行每個變量的ddply。像 'grupoAntig' 以下:

> ddply(muestra, .(grupoAntig), summarise, ratioTarget=sum(target)/length(target)) 
    grupoAntig ratioTarget 
1  20a40 0.01038062 
2  h20 0.01201201 
3  m40 0.00785325 

所以我就開始做創建的變量列表:

formula<-gsub(" ", "",as.character(lr$formula)) 
vars<-unlist(strsplit(formula, "[+]")) 

如果讓我選擇瓦爾[3]我得到:

> vars[3] 
[1] "grupoAntig" 

而在ddply(plyr庫)中,我需要引入變量名稱而不用分號。所以,我想:

> as.name(vars[3]) 
grupoAntig 

但是當我嘗試它裏面ddply:

library(plyr) 
ddply(muestra, .(as.name(vars[3])), summarise, ratioTarget=sum(target)/length(target)) 

我得到一個錯誤信息:

錯誤unique.default(X):

如何在ddply中使用每個變量名稱?

回答

2

沒有必要與gsub()strsplit()糾結得到公式中的值。您可以使用all.vars()獲取所有公式變量。

x <- target ~ grupoAntig + nu_seguros_1TRUNC + cd_sexo + grupoEdad + 
    vl_limite_aeQU + vl_ltd_6QU + Revolv3 + nu_servicios_1TRUNC + 
    fl_cliente_hit + nu_resumen_6 + fl_rv 

all.vars(x) 
# [1] "target"    "grupoAntig"   "nu_seguros_1TRUNC" 
# [4] "cd_sexo"    "grupoEdad"   "vl_limite_aeQU"  
# [7] "vl_ltd_6QU"   "Revolv3"    "nu_servicios_1TRUNC" 
# [10] "fl_cliente_hit"  "nu_resumen_6"  "fl_rv"   

此外,還可以使用角色的名字在ddply()所以沒有必要.()as.name()那裏。從?ddply -

.variables
變量來分割由數據幀,作爲as.quoted變量,公式或字符向量

下面是與mtcars一個例子。

ddply(mtcars, "cyl", summarise, sumMpg = sum(mpg)) 
# cyl sumMpg 
# 1 4 293.3 
# 2 6 138.2 
# 3 8 211.4 

ddply(mtcars, .(cyl), summarise, sumMpg = sum(mpg)) 
# cyl sumMpg 
# 1 4 293.3 
# 2 6 138.2 
# 3 8 211.4