【问题标题】:Merging three vectors with NaN's将三个向量与 NaN 合并
【发布时间】:2017-07-12 14:06:08
【问题描述】:

我有三个看起来像这样的向量:

x = c(NaN, 15, 16, 14, 14, NaN)
y = c(NaN, NaN, NaN, NaN, NaN, 11)
z = c(17, NaN, NaN, NaN, NaN, 12)

我需要将它们合并为一个向量。我需要这三个平滑地啮合在一起,并且在有重叠值的地方(如 y 和 z 中所见),应优先考虑 z 中的值。最终结果应如下所示:

xyz = c(17, 15, 16, 14, 14, 12)

我已经研究过使用 rowSums 来处理 na,但这在同一个索引上有多个值的情况下不起作用。如果可能,我会尽量避免 for 循环。

很确定我可以通过遍历向量来做到这一点,但我正在处理一个相当大的数据集。

【问题讨论】:

  • NaN 到底是什么意思?
  • 不是数字——很确定这些来自于从 .csv 读取空单元格。它们似乎与 NA 的工作方式相同,因为我可以在 rowSums 中使用 na.rm 来操作它们,但它们打印为 NaN,所以我想我应该将它包含在内。
  • 我更习惯NA而不是NaN,但我看到它是保留字和有效值。有趣...(虽然对您的问题没有多大帮助,但恐怕):(
  • 最近几天做了一些挖掘——结果表明整数可以容纳 NA,但双精度数可以容纳 NA、NaN、Inf 或 -Inf——允许除法等特殊情况.我遇到了这个问题,因为我的表格数据被作为双精度向量读入。无论如何,对解决方案并不重要,但我想你可能会对为什么两者都存在感兴趣!

标签: r vector merge na


【解决方案1】:

这似乎有效。 NB 它依赖于 z 作为数据框的最后一列,然后将其翻转为第一列(即 rev)。

df <- data.frame(x = c(NaN, 15, 16, 14, 14, NaN),
            y = c(NaN, NaN, NaN, NaN, NaN, 11),
            z = c(17, NaN, NaN, NaN, NaN, 12))

do.call(dplyr::coalesce, rev(df))


你也可以使用zoo包:

df <- rbind(x, y, z)

#it replaces last row with latest non-NA value therefore z always has priority:
xyz <- zoo::na.locf(df)['z',]

#[1] 17 15 16 14 14 12

数据

x <- c(NaN, 15, 16, 14, 14, NaN)
y <- c(NaN, NaN, NaN, NaN, NaN, 11)
z <- c(17, NaN, NaN, NaN, NaN, 12)

【讨论】:

  • 完美!我需要深入研究帮助文件以了解为什么它在做我需要的事情,但这绝对可以。非常感谢!
【解决方案2】:

或者你可以使用基本 R 函数na.omit

x = c(NaN, 15, 16, 14, 14, NaN)
y = c(NaN, NaN, NaN, NaN, NaN, 11)
z = c(17, NaN, NaN, NaN, NaN, 12)
dt=data.frame(z=z,x=x,y=y)
unlist(lapply(apply(dt,1,na.omit), `[[`, 1))

[1] 17 15 16 14 14 12

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 2022-01-03
    • 2016-05-19
    • 2015-08-07
    • 2021-04-24
    • 2022-08-16
    • 2015-06-30
    • 2019-07-26
    相关资源
    最近更新 更多