我一直试图弄清楚这一点,但我似乎无法找到解决这个编码问题的方法。我想创建一个重复相同值的列向量,直到下一个非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
答案 0 :(得分:3)
鉴于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"
答案 1 :(得分:2)
如果字符值为“NA”,即北美的缩写,而不是NA_character_
,可能会遇到困难,而有些令人困惑的也会被打印为NA:
c("NA", NA_character_, NA)
#[1] "NA" NA NA
is.na(c("NA", NA_character_, NA))
#[1] FALSE TRUE TRUE
....但假设这不是问题,那就像马修建议的那样:
require(zoo)
filled <- na.locf(vec)
答案 2 :(得分:1)
如果没有使用zoo
函数的rle
包,您也可以非常简洁地执行此操作:
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"