用一个序列替换向量中的NA值。

5
我有以下数据:
avec <- c("somevar", NA ,"anothervar", NA, "thisvar","thatvar", NA, "lastvar", NA )

我想做的就是将avec中所有的NA值替换为连续的变量名,例如x001x00n。我觉得这应该很容易,但我在Stack上找不到任何相关信息。

期望输出:

avec <- c("somevar", "x001","anothervar", "x002", "thisvar","thatvar", "x003", "lastvar", "x004")

我该怎么做呢?

5个回答

4

使用replace方法。

f <- \(x) replace(x, is.na(x), sprintf('x%03d', seq_len(sum(is.na(x)))))

f(avec)
# [1] "somevar"    "x001"       "anothervar" "x002"       "thisvar"    "thatvar"    "x003"      
# [8] "lastvar"    "x004"    

3

我更倾向于以列为基础进行思考,以下是我的方法:

library(dplyr)

as.data.frame(avec) %>% 
  mutate(avec = ifelse(is.na(avec), paste0("x00", cumsum(is.na(avec))), avec)) %>% 
  pull(avec)

[1] "somevar"    "x001"       "anothervar" "x002"       "thisvar"    "thatvar"    "x003"       "lastvar"   
[9] "x004"  

3

一种解决方案:

avec[is.na(avec)] = paste0("x00", seq_along(avec[is.na(avec)]))

[1] "somevar"    "x001"       "anothervar" "x002"       "thisvar"    "thatvar"    "x003"       "lastvar"    "x004"

为了使数字更加灵活,可以使用以下代码:avec[is.na(avec)] <- paste0("x", formatC(seq_len(sum(is.na(avec))), 2, flag = "0")) - Maël

3

另一种选择:

dplyr::coalesce(avec, sprintf("X%03i", cumsum(is.na(avec))))
#> [1] "somevar"    "X001"       "anothervar" "X002"       "thisvar"   
#> [6] "thatvar"    "X003"       "lastvar"    "X004"

2

avec <- c("somevar", NA ,"anothervar", NA, "thisvar","thatvar", NA, "lastvar", NA )
na_pos <- 1
for (i in avec |> length() |> seq()) {
  if (is.na(avec[[i]])) {
    avec[[i]] <- sprintf("X%03i", na_pos)
    na_pos <- na_pos + 1
  }
}
avec

# [1] "somevar"    "X001"       "anothervar" "X002"       "thisvar"    "thatvar"    "X003"       "lastvar"    "X004"      

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接