2015-07-21 70 views
1

我花了一整天的時間試圖熟悉r中的(for)循環函數,但是我沒有找到解決問題的方法。如何在r中循環?

我想爲27個國家執行以下計算,而不必一次又一次鍵入代碼。

percentageAT_leakingroof <- length(c11dep$hh040[c11dep$hh040==0 & c11dep$db020=="AT"])/length(c11dep$hh040[c11dep$db020=="AT"]) 

percentageBE_leakingroof <- length(c11dep$hh040[c11dep$hh040==0 & c11dep$db020=="BE"])/length(c11dep$hh040[c11dep$db020=="BE"]) 

是否可以編寫一個循環來計算以下27個級別的百分比? (並且也能夠正確地爲它們命名?「percentageAT_leakingroof」,「percentageAT_leakingroof」等)

levels <- c("AT", "BE", "BG", "CH", "CY", "CZ", "DE", "DK", "EE", "EL", "ES", "FI", "FR", "HU", "IT", "LT", "LU", "LV", "MT", "NL", "PL", "PT", "RO", "SE", "SI", "SK", "UK") 

預先感謝您的幫助!

+1

試着用'sapply/lapply'即'LST < - lapply(levels,function(x)length(c11dep $ hh040 [c11dep $ hh040 == 0&c11dep $ db020 == x])/ length(c11dep $ hh040 [c11dep $ db020 == x])); names(lst)< - paste0('percentage',levels,'_ leakingroof'); lst' – akrun

+0

用'table'和'prop.table'可能會更容易些。一個可重複的例子將會有所幫助 – akrun

回答

2

查看dplyr包。這是完成這種任務。

library(dplyr) 

c11dep %>% 
    group_by(db020) %>% 
    summarise(percentageAT_leakingroof = sum(hh040==0)/n()) 
0

如果一切都失敗:

for(n in 1:27){ 
    write(paste0("percentage", levels[n], "_leakingroof <- length(c11dep$hh040[c11dep$hh040==0 & c11dep$db020==\"", levels[n], "\"])/length(c11dep$hh040[c11dep$db020==\"", levels[n], "\"])", "tmp.R") 
    source("tmp.R") 
    file.remove("tmp.R") 
} 

獲取R鍵寫,然後執行該代碼爲您服務!使用\"作爲雙引號。

+0

但是對於命名變量,使用'assign'命令。 – Bazz

0

雖然我也建議使用dplyr,具有for循環,你可以做這樣的事情打印結果:

for (i in levels) { 
    length(c11dep$hh040[c11dep$hh040==0 & c11dep$db020==i])/length(c11dep$hh040[c11dep$db020==i]) 
} 

分配的部分是有點棘手。列表是一個簡單的開始:

results <- list() 
for (i in seq_along(levels)) { 
    results[[levels[i]]] <- length(c11dep$hh040[c11dep$hh040==0 & c11dep$db020==levels[i]])/length(c11dep$hh040[c11dep$db020==levels[i]]) 
} 

或者,如果你想與你的命名方案的載體,包括assign到循環:

for (i in seq_along(levels)) { 
    res <- length(c11dep$hh040[c11dep$hh040==0 & c11dep$db020==levels[i]])/length(c11dep$hh040[c11dep$db020==levels[i]]) 

    # String for the vector name you want 
    vec_name <- paste0("percentage", levels[i], "_leakingroof") 

    assign(vec_name, res) 
}