2014-07-17 70 views
1

我需要計算Balassa Index的分母,即每個國家i我需要計算sum(x_kj)/Xj每個國家j =/= i每年(time),其中k被認爲是部門和X是總和跨所有部門。我的數據集看起來像下面操作與r中多發的條件

Country <- c("Italy", "Italy", "Italy", "Korea", "Korea", "Korea", "Norway", "Norway", "Norway") 
id <- as.numeric(as.factor(Country)) 
Time <- c("1990", "1991", "1992","1990", "1991", "1992", "1990", "1991", "1992") 
x_k <- c(124,144,135,122,111,231,423,444,441) 
X <- c(1000, 1003, 1005, 1409, 1419, 1359, 4250, 4345, 4681) 
df <- cbind(Country, id, Time, x_k) 
df2 <- cbind(Country, id, Time, X) 
df 
df2 

其中df是扇區的數據kdf2是跨部門的總和數據幀。我使用此代碼:

df$denominator <- NA 
for (i in 1990:1992) { 
for (j in 1:max(df$id)) { 
if (df[,"Time"] == i & df[,"id"]== j) { 
    if (df[,"id"] != j & df[,"Time"] ==i) { 
     df[j,"denominator"] <- sum(df[,"x_k"], na.rm=T) /df2[,"X"] 
    }              
    } 
} 
} 

它給我的同類50級的警告,即In if (df[, "Time"] == i & df[, "id"] == ... : the condition has length > 1 and only the first element will be used

看起來像我失去了一些東西(弄得一團糟,其實),但我沒有得到什麼

編輯

這是我所需要的,使用上面的數據爲例。

對於意大利在1990年我想要的x_k韓國和挪威於1990年在1990年的總和,超過X韓國和挪威的總和同樣,韓國在1990年我想要的x_k挪威和意大利的總和1990年,同年挪威和意大利的總和爲X。這是我試圖建立的代碼中明顯矛盾的表述。所以:對於1990年的意大利,分母將是(122+423)/(1409+4250)。對於1990年的韓國,它將是每個國家和每年的(124+423)/(1000+4250)等等等等。 df = data.frame(df)

  • 轉換列數字:df$x_k = as.numeric(df$x_k)
  • 添加X的df,這樣你只需要使用一個數據幀

  • +1

    'df [,「Time」]'選擇一個整列。然而,'if'只是比較單個值(參見'ifelse'爲矢量化版本)。這是事情出錯的地方... – konvas

    +0

    我無法看到如何在我寫的內容中包含ifelse – Bob

    回答

    0

    如果

    1. 你轉換DF和DF2到數據幀的問題可以得到解決:df$X = as.numeric(df2$X)
    2. 代碼中的第四行說:if(... df[,"id"]== j;第五行說:if(... df[,"id"] != j ;;因此不會選擇行;第二行if(... df[,"Time"] ==i ;;第三行:爲什麼重複?
    3. 兩個if語句可以合併爲一個。

    我不清楚你想要什麼最終值,但它們是由下面的代碼給出:

    mydf = structure(list(country = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 
    3L, 3L, 3L), .Label = c("Italy", "Korea", "Norway"), class = "factor"), 
        id = c(1, 1, 1, 2, 2, 2, 3, 3, 3), time = c(1990, 1991, 1992, 
        1990, 1991, 1992, 1990, 1991, 1992), x_k = c(124, 144, 135, 
        122, 111, 231, 423, 444, 441), x = c(1000, 1003, 1005, 1409, 
        1419, 1359, 4250, 4345, 4681), denominator = c(NA, NA, NA, 
        NA, NA, NA, NA, NA, NA)), .Names = c("country", "id", "time", 
    "x_k", "x", "denominator"), row.names = c(NA, -9L), class = "data.frame") 
    
    mydf 
        country id time x_k x denominator 
    1 Italy 1 1990 124 1000   NA 
    2 Italy 1 1991 144 1003   NA 
    3 Italy 1 1992 135 1005   NA 
    4 Korea 2 1990 122 1409   NA 
    5 Korea 2 1991 111 1419   NA 
    6 Korea 2 1992 231 1359   NA 
    7 Norway 3 1990 423 4250   NA 
    8 Norway 3 1991 444 4345   NA 
    9 Norway 3 1992 441 4681   NA 
    
    
    
    for (i in 1990:1992) { 
    for (j in 1:max(mydf$id)) { 
        with(mydf[mydf$time==i & mydf$id==j,], 
         { 
         print(sum(x_k, na.rm=T)/x); 
         } 
        ) 
    } 
    } 
    
    
    [1] 0.124 
    [1] 0.08658623 
    [1] 0.09952941 
    [1] 0.1435693 
    [1] 0.0782241 
    [1] 0.1021864 
    [1] 0.1343284 
    [1] 0.1699779 
    [1] 0.09421064 
    

    編輯:根據你的例子,下面可能的值,您需要:

    for (i in 1990:1992) 
        for (j in 1:max(mydf$id)) 
         with(mydf[time==i & id!=j,], print(sum(x_k)/sum(x)) ) 
    
    [1] 0.09630677 
    [1] 0.1041905 
    [1] 0.1021171 
    [1] 0.0962873 
    [1] 0.1099476 
    [1] 0.1052849 
    [1] 0.1112583 
    [1] 0.1013014 
    [1] 0.1548223 
    
    +0

    感謝您的回答。 1)e 2),它們已經是data.frame和numeric。 3)我不能,因爲我有15個部門,所以我有df1到df15。我認爲真正的觀點是4)。事實上,我確實需要一個操作員來說明4)而不會導致沒有選擇。結果將與您的解決方案有所不同。我會用一個例子來更新這個問題,以澄清我需要的東西。 – Bob

    +0

    請參閱上面我的回答中的編輯。 HTH。 – rnso

    +0

    錯的東西。輸出的前3個值應該是'0.09630677,0.0962873,0.11112583',這是你例子中的第一,第四和第七。第四個應該是'0.1041905'(即韓國1990),這是你輸出中的第二個。看起來你的代碼產生了「意大利1990年,韓國1990年,挪威1990年,意大利1991年,韓國1991年......」 – Bob