【发布时间】:2018-12-02 19:18:01
【问题描述】:
我有一个数据框,列中有许多时间序列(例如 col1 中的一个序列)。我想遍历每个时间序列并保留出现在 NA 之后的第一个值,并将 仅连续 3 个值设置为 NA(col2 中所需结果的示例)。理想情况下,这应该适用于数据框中的所有或指定(例如 [2:30])列。
This answer 不考虑仅 3 个连续值到 NA 的条件。
样本数据
df <- data.frame(
col1 = c(7.00, NA, NA, 1.00, 2.00, 5.00, NA, 5.00, 7.00, NA, NA, 1.00, NA, 2.00, NA, NA, 1.00, 3.00, 4.00, 5.00, 6.00, 7.00, NA, 7.00, NA),
col2 = c(7.00, NA, NA, 1.00, NA, NA, NA, 5.00, NA, NA, NA, 1.00, NA, 2.00, NA, NA, 1.00, NA, NA, NA, 6.00, NA, NA, 7.0, NA),
stringsAsFactors = FALSE)
感谢您的帮助。
【问题讨论】:
-
第 22 行是否正确?我期望一个
7输出,但你有一个NA。这似乎是自col1中的最后一个NA以来的第六行。 -
@JonSpring。谢谢你,乔恩。很好的解决方案。但是,确实,我的例子是“正确的”。我在我的问题中说得不够清楚:如果在 NA 之后有超过 4 个有效值,则应将第 5 个视为 NA 之后的第一个。
-
啊哈。不,这还不清楚。从措辞看来,
NA之后的每组中只有第 2:4 行应该是NA,但听起来您想将相同的模式应用于第 6:8、10:12 等行。相应地修改了我的答案。 -
@JonSpring:太棒了。这就是诀窍。非常感谢你。是否可以对数据框中的所有列或指定列运行此操作?
-
# / NA 逻辑会为每一列单独工作,还是它们都基于一个“关键”列?如果原始数据看起来像这样,您会期望什么输出?
df <- data.frame(colA = c(7.0, NA, NA, 1.0, 2.0, 3.0, 4.0, 5.0), colB = c(2.0, 2.0, NA, NA, 6.0, 7.0, 8.0, 9.0), stringsAsFactors = FALSE)
标签: r time-series na