Create a model frame for a formula object, by handling the left hand side the same way the right hand side is handled in model.frame. Especially variables separated by + are interpreted as separate variables.

ParseFormula(formula, data = parent.frame(), drop = TRUE)

Arguments

formula

an object of class "formula" (or one that can be coerced to that class): a symbolic description for the variables to be described.

data

an optional data frame, list or environment (or object coercible by as.data.frame to a data frame) containing the variables in the model. If not found in data, the variables are taken from environment(formula), typically the environment from which lm is called.

drop

if drop is TRUE, unused factor levels are dropped from the result when creating interaction terms. The default is to drop all unused factor levels.

Details

This is used by Desc.formula for describing data by groups while remaining flexible for using I(...) constructions, functions or interaction terms.

Value

a list of 3 elements

formula

the formula which had to be parsed

lhs

a list of 3 elements:
mf: data.frame, the model.frame of the left hand side of the formula
mf.eval: data.frame, the evaluated model.frame of the left hand side of the formula
vars: the names of the evaluated model.frame

rhs

a list of 3 elements:
mf: data.frame, the model.frame of the right hand side of the formula
mf.eval: data.frame, the evaluated model.frame of the right hand side of the formula
vars: the names of the evaluated model.frame

Author

Andri Signorell <andri@signorell.net>

See also

The functions used to handle formulas: model.frame, terms, formula
Used in: Desc.formula

Examples

set.seed(17)
piz <- d.pizza[sample(nrow(d.pizza),10), c("temperature","price","driver","weekday")]

f1 <- formula(. ~ driver)
f2 <- formula(temperature ~ .)
f3 <- formula(temperature + price ~ .)
f4 <- formula(temperature ~ . - driver)
f5 <- formula(temperature + price ~ driver)
f6 <- formula(temperature + price ~ driver * weekday)
f7 <- formula(I(temperature^2) + sqrt(price) ~ driver + weekday)
f8 <- formula(temperature + price ~ 1)
f9 <- formula(temperature + price ~ driver * weekday - price)

ParseFormula(f1, data=piz)  
#> $formula
#> . ~ driver
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      temperature  price weekday
#> 108         61.5 62.955       1
#> 495         53.8 73.746       5
#> 423         53.8 21.980       3
#> 150         45.7 47.664       3
#> 1153        47.5 16.990       7
#> 721         30.7 36.970       4
#> 458         57.6 31.980       4
#> 774         38.6 78.237       5
#> 1182        33.8 45.864       1
#> 404         35.5 31.176       2
#> 
#> $lhs$mf.eval
#>      temperature  price weekday
#> 108         61.5 62.955       1
#> 495         53.8 73.746       5
#> 423         53.8 21.980       3
#> 150         45.7 47.664       3
#> 1153        47.5 16.990       7
#> 721         30.7 36.970       4
#> 458         57.6 31.980       4
#> 774         38.6 78.237       5
#> 1182        33.8 45.864       1
#> 404         35.5 31.176       2
#> 
#> $lhs$vars
#> [1] "temperature" "price"       "weekday"    
#> 
#> 
#> $rhs
#> $rhs$mf
#>         driver
#> 108     Hunter
#> 495  Carpenter
#> 423     Carter
#> 150     Carter
#> 1153    Miller
#> 721  Carpenter
#> 458     Carter
#> 774     Miller
#> 1182 Carpenter
#> 404     Taylor
#> 
#> $rhs$mf.eval
#>         driver
#> 108     Hunter
#> 495  Carpenter
#> 423     Carter
#> 150     Carter
#> 1153    Miller
#> 721  Carpenter
#> 458     Carter
#> 774     Miller
#> 1182 Carpenter
#> 404     Taylor
#> 
#> $rhs$vars
#> [1] "driver"
#> 
#> 
ParseFormula(f2, data=piz)  
#> $formula
#> temperature ~ .
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      temperature
#> 108         61.5
#> 495         53.8
#> 423         53.8
#> 150         45.7
#> 1153        47.5
#> 721         30.7
#> 458         57.6
#> 774         38.6
#> 1182        33.8
#> 404         35.5
#> 
#> $lhs$mf.eval
#>      temperature
#> 108         61.5
#> 495         53.8
#> 423         53.8
#> 150         45.7
#> 1153        47.5
#> 721         30.7
#> 458         57.6
#> 774         38.6
#> 1182        33.8
#> 404         35.5
#> 
#> $lhs$vars
#> [1] "temperature"
#> 
#> 
#> $rhs
#> $rhs$mf
#>       price    driver weekday
#> 108  62.955    Hunter       1
#> 495  73.746 Carpenter       5
#> 423  21.980    Carter       3
#> 150  47.664    Carter       3
#> 1153 16.990    Miller       7
#> 721  36.970 Carpenter       4
#> 458  31.980    Carter       4
#> 774  78.237    Miller       5
#> 1182 45.864 Carpenter       1
#> 404  31.176    Taylor       2
#> 
#> $rhs$mf.eval
#>       price    driver weekday
#> 108  62.955    Hunter       1
#> 495  73.746 Carpenter       5
#> 423  21.980    Carter       3
#> 150  47.664    Carter       3
#> 1153 16.990    Miller       7
#> 721  36.970 Carpenter       4
#> 458  31.980    Carter       4
#> 774  78.237    Miller       5
#> 1182 45.864 Carpenter       1
#> 404  31.176    Taylor       2
#> 
#> $rhs$vars
#> [1] "price"   "driver"  "weekday"
#> 
#> 
ParseFormula(f3, data=piz)
#> $formula
#> temperature + price ~ .
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$mf.eval
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$vars
#> [1] "temperature" "price"      
#> 
#> 
#> $rhs
#> $rhs$mf
#>         driver weekday
#> 108     Hunter       1
#> 495  Carpenter       5
#> 423     Carter       3
#> 150     Carter       3
#> 1153    Miller       7
#> 721  Carpenter       4
#> 458     Carter       4
#> 774     Miller       5
#> 1182 Carpenter       1
#> 404     Taylor       2
#> 
#> $rhs$mf.eval
#>         driver weekday
#> 108     Hunter       1
#> 495  Carpenter       5
#> 423     Carter       3
#> 150     Carter       3
#> 1153    Miller       7
#> 721  Carpenter       4
#> 458     Carter       4
#> 774     Miller       5
#> 1182 Carpenter       1
#> 404     Taylor       2
#> 
#> $rhs$vars
#> [1] "driver"  "weekday"
#> 
#> 
ParseFormula(f4, data=piz)
#> $formula
#> temperature ~ . - driver
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      temperature
#> 108         61.5
#> 495         53.8
#> 423         53.8
#> 150         45.7
#> 1153        47.5
#> 721         30.7
#> 458         57.6
#> 774         38.6
#> 1182        33.8
#> 404         35.5
#> 
#> $lhs$mf.eval
#>      temperature
#> 108         61.5
#> 495         53.8
#> 423         53.8
#> 150         45.7
#> 1153        47.5
#> 721         30.7
#> 458         57.6
#> 774         38.6
#> 1182        33.8
#> 404         35.5
#> 
#> $lhs$vars
#> [1] "temperature"
#> 
#> 
#> $rhs
#> $rhs$mf
#>       price weekday
#> 108  62.955       1
#> 495  73.746       5
#> 423  21.980       3
#> 150  47.664       3
#> 1153 16.990       7
#> 721  36.970       4
#> 458  31.980       4
#> 774  78.237       5
#> 1182 45.864       1
#> 404  31.176       2
#> 
#> $rhs$mf.eval
#>       price weekday
#> 108  62.955       1
#> 495  73.746       5
#> 423  21.980       3
#> 150  47.664       3
#> 1153 16.990       7
#> 721  36.970       4
#> 458  31.980       4
#> 774  78.237       5
#> 1182 45.864       1
#> 404  31.176       2
#> 
#> $rhs$vars
#> [1] "price"   "weekday"
#> 
#> 
ParseFormula(f5, data=piz)
#> $formula
#> temperature + price ~ driver
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$mf.eval
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$vars
#> [1] "temperature" "price"      
#> 
#> 
#> $rhs
#> $rhs$mf
#>         driver
#> 108     Hunter
#> 495  Carpenter
#> 423     Carter
#> 150     Carter
#> 1153    Miller
#> 721  Carpenter
#> 458     Carter
#> 774     Miller
#> 1182 Carpenter
#> 404     Taylor
#> 
#> $rhs$mf.eval
#>         driver
#> 108     Hunter
#> 495  Carpenter
#> 423     Carter
#> 150     Carter
#> 1153    Miller
#> 721  Carpenter
#> 458     Carter
#> 774     Miller
#> 1182 Carpenter
#> 404     Taylor
#> 
#> $rhs$vars
#> [1] "driver"
#> 
#> 
ParseFormula(f6, data=piz)
#> $formula
#> temperature + price ~ driver * weekday
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$mf.eval
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$vars
#> [1] "temperature" "price"      
#> 
#> 
#> $rhs
#> $rhs$mf
#>         driver weekday
#> 108     Hunter       1
#> 495  Carpenter       5
#> 423     Carter       3
#> 150     Carter       3
#> 1153    Miller       7
#> 721  Carpenter       4
#> 458     Carter       4
#> 774     Miller       5
#> 1182 Carpenter       1
#> 404     Taylor       2
#> 
#> $rhs$mf.eval
#>         driver weekday driver:weekday
#> 108     Hunter       1       Hunter:1
#> 495  Carpenter       5    Carpenter:5
#> 423     Carter       3       Carter:3
#> 150     Carter       3       Carter:3
#> 1153    Miller       7       Miller:7
#> 721  Carpenter       4    Carpenter:4
#> 458     Carter       4       Carter:4
#> 774     Miller       5       Miller:5
#> 1182 Carpenter       1    Carpenter:1
#> 404     Taylor       2       Taylor:2
#> 
#> $rhs$vars
#> [1] "driver"         "weekday"        "driver:weekday"
#> 
#> 
ParseFormula(f7, data=piz)
#> $formula
#> I(temperature^2) + sqrt(price) ~ driver + weekday
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      I(temperature^2) sqrt(price)
#> 108           3782.25    7.934419
#> 495           2894.44    8.587549
#> 423           2894.44    4.688283
#> 150           2088.49    6.903912
#> 1153          2256.25    4.121893
#> 721            942.49    6.080296
#> 458           3317.76    5.655086
#> 774           1489.96    8.845168
#> 1182          1142.44    6.772297
#> 404           1260.25    5.583547
#> 
#> $lhs$mf.eval
#>      I(temperature^2) sqrt(price)
#> 108           3782.25    7.934419
#> 495           2894.44    8.587549
#> 423           2894.44    4.688283
#> 150           2088.49    6.903912
#> 1153          2256.25    4.121893
#> 721            942.49    6.080296
#> 458           3317.76    5.655086
#> 774           1489.96    8.845168
#> 1182          1142.44    6.772297
#> 404           1260.25    5.583547
#> 
#> $lhs$vars
#> [1] "I(temperature^2)" "sqrt(price)"     
#> 
#> 
#> $rhs
#> $rhs$mf
#>         driver weekday
#> 108     Hunter       1
#> 495  Carpenter       5
#> 423     Carter       3
#> 150     Carter       3
#> 1153    Miller       7
#> 721  Carpenter       4
#> 458     Carter       4
#> 774     Miller       5
#> 1182 Carpenter       1
#> 404     Taylor       2
#> 
#> $rhs$mf.eval
#>         driver weekday
#> 108     Hunter       1
#> 495  Carpenter       5
#> 423     Carter       3
#> 150     Carter       3
#> 1153    Miller       7
#> 721  Carpenter       4
#> 458     Carter       4
#> 774     Miller       5
#> 1182 Carpenter       1
#> 404     Taylor       2
#> 
#> $rhs$vars
#> [1] "driver"  "weekday"
#> 
#> 
ParseFormula(f8, data=piz)
#> $formula
#> temperature + price ~ 1
#> <environment: 0x653e167c1340>
#> 
#> $lhs
#> $lhs$mf
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$mf.eval
#>      temperature  price
#> 108         61.5 62.955
#> 495         53.8 73.746
#> 423         53.8 21.980
#> 150         45.7 47.664
#> 1153        47.5 16.990
#> 721         30.7 36.970
#> 458         57.6 31.980
#> 774         38.6 78.237
#> 1182        33.8 45.864
#> 404         35.5 31.176
#> 
#> $lhs$vars
#> [1] "temperature" "price"      
#> 
#> 
#> $rhs
#> $rhs$mf
#> data frame with 0 columns and 10 rows
#> 
#> $rhs$mf.eval
#> data frame with 0 columns and 10 rows
#> 
#> $rhs$vars
#> character(0)
#> 
#>