【发布时间】:2019-06-05 18:58:39
【问题描述】:
我正在尝试在 for 循环中使用嵌套 ifelse 语句来创建一个新变量,其值基于因子变量(邮政编码列表)的出现频率。
新变量应根据邮政编码的频率(频率范围在 1 到 4 之间)返回一系列预定义的数字。这些数字系列中的每一个都必须以 800 结尾并以 200 为增量增加,其起点取决于每个邮政编码的频率:频率越高,200 的起始增量越低。
为此,我定义了一个 for 循环,在其中我首先测量每个邮政编码的频率,然后是一个嵌套的 ifelse 语句,根据频率指定要分配给 NewVar 的每个数字系列。
这里写了一个我想要实现的小直观示例,我想将其应用于包含数百万邮政编码的数据框。
期望的结果:
Postcode NewVar
AA 600
AA 800
BB 400
BB 600
BB 800
CC 800
DD 200
DD 400
DD 600
DD 800
代码:
DF$NewVar <- 0
DF$NewVar <- for (i in levels(DF$Postcode[i]))
ifelse((table(DF$Postcode[i]) == 4), DF$NewVar[i] <- c(200,400,600,800),
(ifelse ((table(DF$Postcode[i]) == 3), DF$NewVar[i] <- c(400,600,800),
(ifelse ((table(DF$Postcode[i]) == 2), DF$NewVar[i] <- c(600,800),
DF$NewVar[i] <- c(800))))))
问题 1:
首先,在运行整个代码时,我收到一条错误消息,指出替换中的行数与数据不匹配,而在手动检查时,情况并非如此(不匹配总是仅限于 1 行)。
Error in `$<-.data.frame`(`*tmp*`, NewVar, value = c("0", "0", "0", :
replacement has 11 rows, data has 10.
问题 2:
测试 IFELSE 是否独立工作(在循环之外):
在验证 ifelse 子句是否独立工作时(循环外),我看到在 NewVar 的每一行上只复制了 200 的起始增量,因此它不会增加到 800。这不是我的想要实现:
代码测试一个 IFELSE:
DF$NewVar[1:2] <- ifelse((sum(table(DF$Postcode)) == 2),
DF$NewVar[1:2] <- c(600,800), "NA")
结果(不需要):
Postcode NewVar
AA 200
AA 200
期望的结果:
Postcode NewVar
AA 200
AA 400
注意:我在尝试分配变量之前预定义了 NewVar 列,并且我已经检查了 NA。
提前感谢您的宝贵时间。
【问题讨论】:
标签: r loops for-loop if-statement nested