【问题标题】:Add a column with values and NAs [duplicate]添加具有值和 NA 的列 [重复]
【发布时间】:2012-12-29 20:21:33
【问题描述】:

可能重复:
Populate NAs in a vector using prior non-NA values?

我一直试图解决这个问题,但我似乎无法找到解决此编码问题的方法。我喜欢创建一个列向量,它会重复相同的值,直到下一个非 NA 列出现在另一列中。所以这里有一个表格来说明我想要实现的目标(第 2 栏)。

         [,1] [,2]
    [1,] A     a1
    [2,] NA    a1
    [3,] NA    a1
    [4,] B     a2
    [5,] NA    a2
    [6,] A     a3

很抱歉造成混乱。之前写这篇文章的时候,我一定是真的很紧张。我已对第 2 列进行了更正(请参见上文)。阅读您的帖子后,这是我想出的代码,虽然它不高效也不优雅:

     d <- paste("a", 1:sum(!is.na(column1)), sep="")  # get a1, a2, a3  
     column2 <- rep(NA, length(column1)  #create empty vector w/ column1 length
     column2[!is.na(colum1)] <- d #when col1 has a value, populate col2 with a1   
     e  <- na.locf.default(column2) #fill NAs in col2 with previous value

【问题讨论】:

  • 你有一个恒定的第二列...
  • 或者你想要a1,a1,a1,a2,a2,a3在第二列吗??
  • 或者甚至a1, a1, a1, a4, a4, a6
  • 认为您的问题实际上与此处指定的问题并不重复,但很难说。如果你能澄清它的不同(以及你的意思/你想要的输出是什么),我会投票重新开放。

标签: r


【解决方案1】:

给定x

x <- c('A', NA, NA, 'B', NA, 'A')

根据您的问题的最新编辑,您想要什么:

y <- x
y[!is.na(x)] <- seq(sum(!is.na(x)))

paste0('a', na.locf(y))
[1] "a1" "a1" "a1" "a2" "a2" "a3"

正如@flodel 所观察到的,我正在计算字符串中的非 NA 字符。这直接做到了:

> cumsum(!is.na(x))
[1] 1 1 1 2 2 3

> paste0('a', cumsum(!is.na(x)))
[1] "a1" "a1" "a1" "a2" "a2" "a3"

这个结果a1, a1, a1, a4, a4, a6 以它自己的方式看起来是合乎逻辑的,它显示了哪个值被重复了,但这不是你想要的:

y <- x
y[!is.na(x)] <- seq_along(x)[!is.na(x)]

paste0('a', na.locf(y))
[1] "a1" "a1" "a1" "a4" "a4" "a6"

对于@Arun 的评论所表明的(重复的问题),这里有一个方法:

library(zoo)
na.locf(x)
[1] "A" "A" "A" "B" "B" "A"

【讨论】:

  • 或者干脆paste0("a", cumsum(!is.na(x)))
【解决方案2】:

如果字符值是“NA”,即北美的缩写,而不是 NA_character_,您可能会遇到困难,而 NA_character_ 也会被打印为 NA:

 c("NA", NA_character_, NA)
#[1] "NA" NA   NA 
is.na(c("NA", NA_character_, NA))
#[1] FALSE  TRUE  TRUE

....但假设这不是问题,然后按照 Matthew 的建议进行操作:

require(zoo)
filled <- na.locf(vec)

【讨论】:

    【解决方案3】:

    您也可以使用rle 函数在不使用zoo 包的情况下非常简洁地做到这一点:

    x <- c('A', NA, NA, 'B', NA, 'A')
    x.rle <- rle(replace(x, which(is.na(x)), na.str <- '.'))
    x[is.na(x)] <- with(x.rle, rep(values[which(values == na.str) - 1], 
                                   lengths[values == na.str]))
    
    # [1] "A" "A" "A" "B" "B" "A"
    

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 2021-05-28
      • 2022-11-18
      • 2016-08-23
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多