R语言 使用循环的最后已知存储字段填写NA [重复]

qqrboqgw  于 2023-05-26  发布在  其他
关注(0)|答案(4)|浏览(154)

此问题已在此处有答案

Replacing NAs in R with nearest value(6个答案)
3年前关闭。
我正在尝试用我的R代码来填补缺失的名字。我看过了,没看到这个问题在这里。我有一个502X3的 Dataframe 。其中,我一次只做一个专栏。逻辑应读取,如果字段不是NA,则存储名称并移动到下一行。如果该字段为NA,则使用最后存储的名称填写该字段。下面的数据和代码片段。我不确定我在这里做错了什么。任何帮助将是美妙的。提前感谢您的时间。
实际数据集位于:https://pe.usps.com/text/pub28/28apc_002.htm
基本上,我把文件复制到Excel文档中,正在试图找到一种快速填空的方法。我有其他更大的文件,需要有这样做,所以这将是非常有益的,能够做到这一点非常快。也是一个很好的学习方法。:)
在这个例子中,我希望最后的列表是:“lodge”,“lodge”,“loop”,“loop”,“loop”,“mall”,“mall”,“manor”,“manor”,“manor”,“manor”

data <- c("lodge", "lodge", "loop", NA, NA,  "mall", NA, "manor", NA, NA, NA)

    i = 1
    data[i]
    name <- data[i]
    len <- length(data)

    for (i in len) {

      name <- data[i]

      if_else(is.na(name), 
              data[i] <- name,
              name <- data[i])

      i <- i + 1
    }

    data
x6h2sr28

x6h2sr281#

我们也可以从zoo中得到na.locf

library(zoo)
na.locf(data)
#[1] "lodge" "lodge" "loop"  "loop"  "mall"  "manor"
nlejzf6q

nlejzf6q2#

  • 使用tidyr:fill*:
as.character(tidyr::fill(as.data.frame(data), data, .direction="down")$data)

 ## [1] "lodge" "lodge" "loop"  "loop"  "mall"  "manor"
oxcyiej7

oxcyiej73#

可能有一个更简单的方法来做到这一点,但我只是修改了您的代码,使其工作。实际上,您可以定义一个存储姓氏的变量,如下所示:

data <- c("lodge", "lodge", "loop", NA, "mall", "manor")

i = 1
data[i]
name <- data[i]
len <- length(data)

last.name <- ''
for (i in 1:len) {

  name <- data[i]

  ifelse(is.na(name), 
          data[i] <- last.name,
          name <- data[i])

  i <- i + 1
  last.name <- name
}

data
#[1] "lodge" "lodge" "loop"  "loop"  "mall"  "manor"

希望能帮上忙。

mnemlml8

mnemlml84#

我试图保持你的for循环结构,这样你就可以很容易地阅读它。

data <- c("lodge", "lodge", "loop", NA, "mall", "manor")

name <- c()
for (i in data) {
  if (!is.na(i)) {
    name <- c(name,i)
  } else {
    name <- c(name,tail(name,1))
  }
}

使得

> name
[1] "lodge" "lodge" "loop"  "loop"  "mall"  "manor"

相关问题