r - 尽管变量中没有缺失值,但带有 for 循环的 if-else 条件会引发缺失值错误
问题描述
我正在尝试编写一个循环来创建一个变量,以便稍后使用 group_by on 进行进一步计算,这表明特定类型(组变量)是否发生在两个日期(日期变量)之间。我要创建的因子称为leaderFactor。
代码抛出一个错误:“if (test1$party[i] == "PSOE" & test1$elecTypeDate[i] > as_date("1977-01-01") & : 需要 TRUE/FALSE 的地方缺少值",但是两个相关变量中没有包含缺失值,请大家帮忙!谢谢!
(旁注:这是一个具有两种以上事件类型的更复杂场景的示例,因此我将在下面的代码中的 if 和 else 之间使用几个 else if 语句。)
数据:
test1<- structure(list(party = c("PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP", "PP",
"PP", "PP", "PP", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE", "PSOE",
"PSOE", "PSOE", "PSOE", "PSOE"), elecTypeDate = structure(c(3346,
3346, 3346, 3712, 4291, 4503, 4656, 4656, 4656, 4656, 4656, 4656,
4656, 4656, 4656, 4656, 4656, 4656, 4656, 4868, 4868, 4868, 4868,
4868, 4868, 4868, 4868, 4868, 4868, 4991, 4991, 4991, 5144, 5204,
5783, 5995, 6148, 6209, 6360, 6360, 6360, 6360, 6360, 6360, 6360,
6360, 6360, 6360, 6360, 6360, 6360, 6695, 6940, 7274, 7456, 7578,
7790, 7790, 7790, 7790, 7790, 7790, 7790, 7790, 7790, 7790, 7790,
7790, 7821, 8095, 8674, 8766, 8917, 9039, 9251, 9251, 9251, 9251,
9251, 9251, 9251, 9251, 9251, 9282, 9282, 9282, 9435, 9556, 10135,
10500, 10592, 10743, 10743, 10743, 10743, 10743, 10743, 10743,
10743, 10743, 10743, 10743, 10835, 10865, 11017, 11443, 11596,
12173, 12173, 12173, 12173, 12173, 12173, 12173, 12173, 12173,
12204, 12204, 12296, 12326, 12357, 12418, 12478, 12874, 12935,
13453, 13634, 13634, 13634, 13634, 13634, 13634, 13634, 13634,
13634, 13634, 13665, 13695, 13939, 14245, 14245, 14304, 14304,
14914, 15095, 15095, 15095, 15095, 15095, 15095, 15095, 15095,
15095, 15095, 15095, 15095, 15126, 15400, 15400, 15614, 15614,
15645, 16102, 16495, 16556, 16556, 16556, 16556, 16556, 16556,
16556, 16556, 16556, 16556, 16556, 16556, 16587, 16679, 17045,
17045, 17501, 17622, 17928, 17987, 18017, 18017, 18017, 18017,
18017, 18017, 18017, 18017, 18017, 18017, 18017, 18017, 3346,
3346, 3346, 3346, 3377, 3712, 3712, 4291, 4503, 4656, 4656, 4656,
4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4868,
4868, 4868, 4868, 4868, 4868, 4868, 4868, 4868, 4868, 4991, 4991,
4991, 5144, 5204, 5783, 5995, 6148, 6209, 6360, 6360, 6360, 6360,
6360, 6360, 6360, 6360, 6360, 6360, 6360, 6360, 6360, 6695, 6940,
7274, 7456, 7578, 7790, 7790, 7790, 7790, 7790, 7790, 7790, 7790,
7790, 7790, 7790, 7790, 7821, 8095, 8674, 8766, 8917, 9039, 9251,
9251, 9251, 9251, 9251, 9251, 9251, 9251, 9251, 9251, 9282, 9282,
9282, 9435, 9556, 10135, 10500, 10592, 10743, 10743, 10743, 10743,
10743, 10743, 10743, 10743, 10743, 10743, 10743, 10743, 10835,
10865, 11017, 11443, 11596, 12173, 12173, 12173, 12173, 12173,
12173, 12173, 12173, 12173, 12173, 12204, 12204, 12296, 12326,
12357, 12418, 12478, 12874, 12935, 13453, 13634, 13634, 13634,
13634, 13634, 13634, 13634, 13634, 13634, 13634, 13634, 13665,
13695, 13939, 14245, 14304, 14304, 14914, 15095, 15095, 15095,
15095, 15095, 15095, 15095, 15095, 15095, 15095, 15095, 15095,
15126, 15400, 15400, 15614, 15614, 15645, 16102, 16495, 16556,
16556, 16556, 16556, 16556, 16556, 16556, 16556, 16556, 16556,
16556, 16556, 16587, 16679, 17045, 17045, 17501, 17622, 17928,
17987, 18017, 18017, 18017, 18017, 18017, 18017, 18017, 18017,
18017, 18017, 18017, 18017), class = "Date")), row.names = c(NA,
-398L), class = c("tbl_df", "tbl", "data.frame"))
代码:
test1$leaderFactor <- "none"
for(i in test1$leaderFactor){
if(test1$party[i]=="PSOE" &
test1$elecTypeDate[i] > as_date("1977-01-01") &
test1$elecTypeDate[i] < as_date("1997-06-30")){
test1$leaderFactor[i] = "Gonzales"
} else {
test1$leaderFactor[i] = "Rest"}}
sum(is.na(test1$elecTypeDate))
sum(is.na(test1$party))
解决方案
首先,为什么要使用循环?您可以在没有循环的情况下编写相同的内容:
df <- data.frame(
group = rep(c(1, 2), each = 3),
date = as_date(rep(c("2001-06-01", "2002-10-01", "2003-06-01"), 2))
)
df$futureFactor <- ifelse(
df$group == 1
& df$date > as_date("2001-01-01")
& df$date < as_date("2002-12-31"),
"a", "b"
)
生成的代码更短、更类似于 R 并且运行更高效。
如果使用if
而不是ifelse
,请始终使用&&
(and ||
) 而不是&
(and |
):后者是矢量化的,但if
只接受单个 value,如果提供多个 value 则失败,因此矢量化平原没有意义。
现在,为什么你的代码会失败?因为您正在尝试比较日期和因素,而 R 会给您一个有用的警告(这应该是一个错误):
">" 的不兼容方法(“Ops.factor”、“>.Date”)
df$date
您需要通过定义using来确保您的数据具有正确的类型,as_date
就像我在上面的代码中所做的那样。
推荐阅读
- google-cloud-platform - 使用 terraform helm 提供程序安装 helm chart 时出错“用户“客户端”无法在命名空间“kube-system”中创建部署。扩展
- html - 文本变短时不应用左右浮动的文本和图像
- go - 使用 Go 检查是否安装了系统包退出程序
- javascript - 如何在 ReactJs 中自动将 div 聚焦在具有许多其他 div 的页面上
- php - 用于从选定类别运行“正在观看”视频的 PHP 代码
- powerbi - 记分卡上具有数字精度的小数
- javascript - 如何使用forEach用来自json的迭代数据填充矩阵?
- python - tensorflowjs_converter 可以与使用功能 API 制作的 Keras 模型一起使用吗?
- bash - 有没有办法从命令行(FreeBSD/Darwin)将字符串发送到 IPC 套接字?
- python - 在 for 循环的每个循环中向 df 添加一个新列