【发布时间】:2020-07-18 20:05:37
【问题描述】:
这是我第一次使用elseif。我希望创建一个新列mobile$tenuredate(以月为单位),并试图找出产生 NA 值的代码的问题。
结果
mobile$status == 'active'
行为 mobile$tenuredate 提供 NA 值(它们不应该是 NA)。
mobile$status == 'stopped'
行为mobile$tenuredate 提供有效值。
下面是代码
mobile$tenuredate = if (mobile$status=="stopped") {
round(difftime(mobile$EFFECTIVEDATE, mobile$STARTDATE, units="weeks") / 4.348125)
} else if ((mobile$status == "active") && (mobile$difftemp >= 0)) {
round(difftime(mobile$CONTRACTENDDATE, mobile$STARTDATE, units="weeks") / 4.348125)
} else {
round(difftime(mobile$CUTOFFDATE, mobile$STARTDATE, units="weeks") / 4.348125)
}
Data file in CSV available here
这是一个示例数据框。
structure(list(STARTDATE = structure(c(11413, 11639, 11953, 12212,
11335, 12050, 12142, 11225, 12176, 11386), class = "Date"), STOPDATE = structure(c(11436,
12079, NA, 12225, 11345, 12124, 12226, 11999, 12176, 11758), class = "Date"),
EFFECTIVEDATE = structure(c(11436, 12079, NA, 12225, 11345,
12124, 12226, 11999, 12176, 11758), class = "Date"), CONTRACTENDDATE = structure(c(11778,
12004, 12318, 12578, 11700, 12415, 12508, 11977, 12542, 11751
), class = "Date"), CUTOFFDATE = structure(c(12273, 12273,
12273, 12273, 12273, 12273, 12273, 12273, 12273, 12273), class = "Date"),
status = c("stopped", "stopped", "active", "stopped", "stopped",
"stopped", "stopped", "stopped", "stopped", "stopped"), tenuredate = structure(c(1,
14, NA, 0, 0, 2, 3, 25, 0, 12), class = "difftime", units = "weeks")), row.names = c(NA,
-10L), class = c("tbl_df", "tbl", "data.frame"))
提前致谢。
【问题讨论】:
-
不查看您的数据(我目前不关注链接),虽然过于冗长,但我在您的代码中看不到任何会引入
NAs 的内容。这更可能是您如何读取数据的问题,也许是您对数据本身的假设。如果您在问题中使用dput(head(mobile))或data.frame(...)在此处提供数据样本,将会有所帮助。 (dput的原因是它提供了 R 看到的明确数据,而不是您假设 R 使用它的方式。) -
感谢您的建议!已提供上述示例数据,使用
dput()。 -
好的。 (1)
if需要单例比较,您提供的是向量。矢量化方法是合适的。 (2)ifelse当然是合乎逻辑的步骤,但它会让你失败,因为它会丢弃class,你将失去你的Date课程(尽管数学仍然会发生)。待机...
标签: r if-statement na