gpt4 book ai didi

r - 需要对使用循环的函数进行向量化(用向量中的值替换 NA 行)

转载 作者:行者123 更新时间:2023-12-02 07:29:21 26 4
gpt4 key购买 nike

如何将此函数重写为矢量化变体。据我所知,在 R 中使用循环不是好的做法:

# replaces rows that contains all NAs with non-NA values from previous row and K-th column
na.replace <- function(x, k) {
for (i in 2:nrow(x)) {
if (!all(is.na(x[i - 1, ])) && all(is.na(x[i, ]))) {
x[i, ] <- x[i - 1, k]
}
}
x
}

这是函数的输入数据和返回数据:

m <- cbind(c(NA,NA,1,2,NA,NA,NA,6,7,8), c(NA,NA,2,3,NA,NA,NA,7,8,9))
m
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] 1 2
[4,] 2 3
[5,] NA NA
[6,] NA NA
[7,] NA NA
[8,] 6 7
[9,] 7 8
[10,] 8 9

na.replace(m, 2)
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] 1 2
[4,] 2 3
[5,] 3 3
[6,] 3 3
[7,] 3 3
[8,] 6 7
[9,] 7 8
[10,] 8 9

最佳答案

这是一个使用 na.locf 的解决方案在动物园包里。 row.na是一个向量,每行一个分量 m这样一个组件是TRUE如果m的对应行都是NAFALSE否则。然后我们将这些行的所有元素设置为应用 na.locf 的结果。到第 2 列。

## 结尾的行以牺牲一点速度为代价可以替换为 row.na <- apply(is.na(m), 1, all)这更具可读性。

如果我们知道如果任何行有 NA在第 2 列中,该行的所有列都是 NA ,如问题所示,然后以 ## 结尾的行可以减少到只有 row.na <- is.na(m[, 2])

library(zoo)

nr <- nrow(m) ##
nc <- ncol(m) ##

row.na <- .rowSums(is.na(m), nr, nc) == nc ##

m[row.na, ] <- na.locf(m[, 2], na.rm = FALSE)[row.na]

结果是:

> m
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] 1 2
[4,] 2 3
[5,] 3 3
[6,] 3 3
[7,] 3 3
[8,] 6 7
[9,] 7 8
[10,] 8 9

REVISED 一些改进以提高速度,如下面的评论所示。还在讨论中添加了备选方案。

关于r - 需要对使用循环的函数进行向量化(用向量中的值替换 NA 行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23743408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com