使用 JULIA RCall 包将 NA 传递给 R

Posted

技术标签:

【中文标题】使用 JULIA RCall 包将 NA 传递给 R【英文标题】:Passing NA to R using JULIA RCall package 【发布时间】:2020-08-09 09:31:31 【问题描述】:

我在将数组中的 NA 传递给 R 用于 imputeTS 包时遇到了一些问题。

假设我有这个数组:

a = Any[1, 2, 3, NaN, 5]

我想把它传递给这个:

R"""
b <- na_seadec($a, algorithm = "kalman", find_frequency = TRUE, maxgap = Inf)
"""

NaN 不会自动转换为 NA。如何将 NA 值准确传递给 RCall?

【问题讨论】:

【参考方案1】:

NaN 在 Julia 中将是 NaN 在 R 中。 如果你想在 R 中使用 NA,你应该在 Julia 中使用 missing

julia> x = [1, 2, NaN]
3-element ArrayFloat64,1:
   1.0
   2.0
 NaN

julia> y = [1, 2, missing]
3-element ArrayUnionMissing, Int64,1:
 1
 2
  missing

julia> R"$x"
RObjectRealSxp
[1]   1   2 NaN


julia> R"$y"
RObjectIntSxp
[1]  1  2 NA

您可以在 Julia 手册的this section 中找到详细信息。

这是一个示例会话:

julia> R"library(imputeTS)"
RObjectStrSxp
[1] "imputeTS"  "stats"     "graphics"  "grDevices" "utils"     "datasets"
[7] "methods"   "base"


julia> a = [1,2,3,missing,5]
5-element ArrayUnionMissing, Int64,1:
 1
 2
 3
  missing
 5

julia> R"""
       b <- na_seadec($a, algorithm = "kalman", find_frequency = TRUE, maxgap = Inf)
       """
┌ Warning: RCall.jl: Warning in na_seadec(`#JL`$a, algorithm = "kalman", find_frequency = TRUE,  :
│   No seasonality information for dataset could be found, going on without decomposition.
│               Setting find_frequency=TRUE might be an option.
└ @ RCall ~/.julia/packages/RCall/g7dhB/src/io.jl:113
RObjectRealSxp
[1] 1 2 3 4 5

【讨论】:

我想我找到了问题所在。 R 有一个方法 as.numeric() 我不知道它在 Julia 中的等价物。问题是:我没有静态定义“a”,我必须将它定义为一个空数组并将值推送给它。可能问题在于如何定义“a”数组。在推送所有值后,我尝试将其转换为 Float64,但由于它包含缺失,因此出现错误。现在呢? 可能使用例如collect(UnionFloat64, Missing, a) 应该给你你想要的,但我需要一个完整的代码来肯定地说(这与这个问题是分开的 - 所以如果我写的东西不能解决你的问题,也许只是发布另一个具体的问题转换问题)。 好的!!!最终我找到了答案:convert(ArrayUnionMissing, Float64, a)。我认为这绝对等同于 as.numeric()。感谢您的大力帮助! convert 几乎相同,但正如我所建议的那样,相当于collect。不同之处在于collect 将始终进行复制(如R 中的as.numeric),而convert 将不会复制如果a 已经有eltype 等于UnionMissing, Float64

以上是关于使用 JULIA RCall 包将 NA 传递给 R的主要内容,如果未能解决你的问题,请参考以下文章

使用 RCall 将 Julia UnitRange 导入 R

Julia:将 DataFrame 传递给函数会创建指向 DataFrame 的指针?

如何将变量值传递给julia中的宏?

R语言dplyr包将dataframe中的NA值替换(replace)为0实战:所有NA值替换(replace)为0具体列的NA值替换(replace)为0若干列的NA值替换(replace)为0

在 Julia 中使用 PyPlot 为动画实现迭代器

如何使用modalForm包将javascript整数变量作为主键传递到django url