【发布时间】:2015-12-01 02:31:49
【问题描述】:
我有两组数据。我希望根据另一个(年份和三个断点)中包含的条件应用第一组(按年收入)的分类(低、中低、中高、高)。以下是来自这些数据集的样本 - 真实数据集要大得多,而且长度不同。
收入
Country Year GNI.caput
Argentina 2000 7470
Argentina 2001 7000
Argentina 2002 4050
Argentina 2003 3670
Argentina 2004 3810
Denmark 2000 32660
Denmark 2001 31440
Denmark 2002 30870
Denmark 2003 34850
Denmark 2004 42760
Kenya 2000 420
Kenya 2001 400
Kenya 2002 390
Kenya 2003 410
Kenya 2004 460
Philippines 2000 1230
Philippines 2001 1230
Philippines 2002 1190
Philippines 2003 1270
Philippines 2004 1400
休息
Year Break.1 Break.2 Break.3
2004 825 3225 10065
2003 765 3035 9385
2002 735 2935 9075
2001 745 2975 9205
2000 755 2995 9265
我尝试了以下几组循环,但都没有完成,每个都产生了几个错误。
尝试 1
for(i in seq_along(gni.data)){
while(gni.data$Year == break.pts$Year) {
if(gni.data$GNI.caput <= break.pts$Break.1) {
gni.data$Indicator <- "Low"
} else if(gni.data$GNI.caput <= break.pts$Break.2) {
gni.data$Indicator <- "Mid.Low"
} else if(gni.data$GNI.caput <= break.pts$Break.3) {
gni.data$Indicator <- "Mid.Up"
} else if(gni.data$GNI.caput > break.pts$Break.3) {
gni.data$Indicator <- "High"
} else gni.data$Indicator <- "NA"
}
}
警告信息: 1:在 gni.data$Year == break.pts$Year 中: 较长的对象长度不是较短对象长度的倍数 2: 在 while (gni.data$Year == break.pts$Year) { : 条件的长度 > 1 并且只使用第一个元素 ...
尝试 2
for(i in seq_along(gni.data)){
while(gni.data$Year == break.pts$Year) {
ifelse(gni.data$GNI.caput <= break.pts$Break.1, gni.data$Indicator <- "Low",
ifelse(gni.data$GNI.caput <= break.pts$Break.2, gni.data$Indicator <- "Mid.Lo",
ifelse(gni.data$GNI.caput <= break.pts$Break.3, gni.data$Indicator <- "Mid.Up",
ifelse(gni.data$GNI.caput > break.pts$Break.3, gni.data$Indicator <- "High",
gni.data$Indicator <- "NA"))))
}
}
警告消息与尝试 1 相同。
我哪里错了?谢谢!
【问题讨论】:
-
您的警告消息暗示您在 break.pts$Year 中有多个元素。如果这是故意的,那么您可以尝试将您的“==”替换为“%in%”,这将接受一个向量。
-
如果你合并两个数据集,这可能会更容易做到,使用国家年份一个作为
x,一个有削减的作为y,并设置all.x=TRUE。然后,您可以使用对ifelse()的一对嵌套调用编写更简单的代码,而无需使用 for 循环。
标签: r if-statement for-loop while-loop