我需要计算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)
,依此类推,对于每个国家和每年。
答案 0 :(得分:0)
如果
,问题可能会得到解决df = data.frame(df)
df$x_k = as.numeric(df$x_k)
df$X = as.numeric(df2$X)
if(... df[,"id"]== j
;第五行说:if(... df[,"id"] != j
;;因此不会选择任何行; if(... df[,"Time"] ==i
;;为什么重复?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