2013-02-03 97 views
3

任何與此有關的幫助將非常感激。我正在使用Lumley調查軟件包,並試圖簡化我的代碼,但遇到了一些小問題。通過公式在R中運行?

從包中svymean功能被稱爲在我的代碼,其中第一個參數是表示我想要的變量的公式如下,第二個參數是該數據集:

svymean(~hq_ehla, FraSvy, na.rm=TRUE) 

我想創建將拉出均值(比例)和分類變量標準誤差函數,所以我做了以下功能:

stats <- function(repstat, num) { 
    estmean <- as.numeric(round(100 * repstat[num], digits=0)) 
    estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1) 
    return(list(mean=estmean, se=estse)) 
} 

這工作,所以當我拉出的平均值和SE我的第一類,例如,我使用:

stats(svymean(~hq_ehla, FraSvy, na.rm=TRUE), 1)$mean 
stats(svymean(~hq_ehla, FraSvy, na.rm=TRUE), 1)$se 

我想什麼,能夠做的就是簡化這個東西要短得多,在那裏也許我只需要編寫:

stats(FraSvy, "hq_ehla", 1)$mean 

或者類似的東西。問題是,我無法弄清楚如何使用變量名稱將公式傳遞給函數。

回答

8

您可以使用reformulate構建您的公式並在您的函數中調用svymean。使用...通過na.rm或其他參數svymean

stats <- function(terms, data, num, ...) { 
    .formula <- reformulate(terms) 
    repstat <- svymean(.formula, data, ...) 
    estmean <- as.numeric(round(100 * repstat[num], digits=0)) 
    estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1) 
    return(list(mean=estmean, se=estse)) 
} 

stats(data = FraSvy, terms = "hq_ehla", 1, na.rm = TRUE)$mean 

看一看this answer,詳細瞭解programmitically創建公式對象

或者,你可以在函數內部通過一個公式對象。

stats2 <- function(formula, data, num, ...) { 

    repstat <- svymean(formula, data, ...) 
    estmean <- as.numeric(round(100 * repstat[num], digits=0)) 
    estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1) 
    return(list(mean=estmean, se=estse)) 
} 


stats2(data = FraSvy, formula = ~hq_ehla, 1, na.rm = TRUE)$mean 
+0

完美......說不上來爲什麼我找不到那個,謝謝! – RickyB

0

coefSE功能可能使你的生活變得更輕鬆..

# construct a function that takes the equation part of svymean as a string 
# instead of as a formula. everything else gets passed in the same 
# as seen by the `...` 
fun <- function(var , ...) svymean(reformulate(var) , ...) 

# test it out. 
result <- fun("hq_ehla" , FraSvy , na.rm = TRUE) 

# print the results to the screen 
result 

# also your components 
coef(result) 
SE(result) 

# and round it 
round(100 * coef(result)) 
round(100 * SE(result))