用来自函数的向量的值替换嵌套框架中的行的值,使用R dlr

apeeds0o  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(77)

我想使用dblob(或类似的)函数将tibble中一行的现有值替换为相同大小的vector中的值。
在我的真实的问题中,我有一个tibble df,其中包含一些NA缺失值,例如:

df <- tibble(
  column1 = c(1, 5, 10),
  column2 = c(2, NA, 12),
  column3 = c(NA, 7, NA),
  column4 = c(4, 8, 16)

)

字符串
我想用插值来填充那些缺失的值。我可以做如下的事情,效果很好:

num_col <- ncol(df)
x_interp <- seq(1, num_col, 1)

for (idx_row in 1:nrow(df)) {
  df[idx_row, ] <- as.list((spline(x_interp, df[idx_row, ], xout = x_interp, method = "natural")$y))
}


但实际上我有150000行和20列,for循环需要一段时间。
有没有人能提出一种方法来做同样的事情使用dmgr函数?
有主意吗?谢谢!
我尝试过这样的方法,但它不起作用:

df2 <- df %>%
  rowwise() %>%
  mutate(across(everything(), 
                spline(x_interp, across(everything()), xout = x_interp, method = "natural")$y))

我希望在前面的例子中得到这样的结果:

column1 column2 column3 column4
    <dbl>   <dbl>   <dbl>   <dbl>
1       1       2       3       4
2       5       6       7       8
3      10      12      14      16
gtlvzcf8

gtlvzcf81#

这将很快得到你想要的,假设NA值不在第一列或最后一列:

df <- tibble::tibble(
  column1 = c(1, 5, 10),
  column2 = c(2, NA, 12),
  column3 = c(NA, 7, NA),
  column4 = c(4, 8, 16)
  
)

approx_df <- 
  apply(df, 1, function(x) approx(1:length(x), x, 1:length(x))$y) %>%
  t() %>%
  tibble::as_tibble() 

names(approx_df) <- names(df)

> approx_df

# A tibble: 3 × 4
  column1 column2 column3 column4
    <dbl>   <dbl>   <dbl>   <dbl>
1       1       2       3       4
2       5       6       7       8
3      10      12      14      16

字符串
但有两件事.首先,当你在R中使用tibblesdata.frames时,你会想把你的数据序列放在列而不是行中,因为tibbledata.frame中的每一列都是一个原子向量(就像你从c(1,2,3)得到的那样)。
第二,有一个软件包xts(可扩展时间序列)基于一个名为zoo的软件包。这两个软件包对于处理基于序列的数据都非常有用。如果你看看这些软件包并学习如何使用它们,从长远来看,你将保存大量的时间。你的序列必须按列排列,但是,例如,有一个zoo::na.approx()函数可以插值时间序列,所以你不必编写混乱,难以阅读的代码(就像我上面做的那样)。
希望解决方案(以及对其他软件包的参考)对您有帮助!

相关问题