在r中具有多个条件的操作

时间:2014-07-17 15:58:52

标签: r

我需要计算Balassa Index的分母,即我需要为每个国家i和每年({{1}计算sum(x_kj)/Xj的每个国家j =/= i的分母}}),其中time是所考虑的部门,k是所有部门的总和。我的数据集如下所示

X

其中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的数据,k是扇区之和的数据帧。我正在使用此代码:

df2

它给了我50个同类警告,即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"] } } } }

看起来我错过了一些东西(实际上弄得一团糟),但我没有得到什么

修改

这是我需要的一个例子,使用上面的数据。

对于1990年的意大利,我希望1990年韩国和挪威的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,同年挪威和意大利的x_k总和。这是我试图建立的代码中明显矛盾的陈述。所以:对于1990年的意大利,分母将为X。对于韩国,1990年将是(122+423)/(1409+4250),依此类推,对于每个国家和每年。

1 个答案:

答案 0 :(得分:0)

如果

,问题可能会得到解决
  1. 您将df和df2转换为数据框:df = data.frame(df)
  2. 将列转换为数字:df$x_k = as.numeric(df$x_k)
  3. 将X添加到df,这样您只需要使用一个数据框:df$X = as.numeric(df2$X)
  4. 代码中的第四行说:if(... df[,"id"]== j;第五行说:if(... df[,"id"] != j ;;因此不会选择任何行;
  5. 第四和第四第五行说:if(... df[,"Time"] ==i ;;为什么重复?
  6. 两个if语句可以组合成一个。
  7. 我不清楚你想要的最终值是什么,但它们是由以下代码给出的:

    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