r - 使值彼此不相邻 NA

标签 r

下面数据框中的值 >=10(值 31,89,12,69)有时确实按顺序排列,如 89 和 12。我的意思是顺序 123456789,它们彼此相邻。我想让彼此不相邻的值(31,69,在 31 nr 2 之间缺少有序,对于 69,nr 7 和 8 缺少有序)NA。如何编写这个代码?想象一个大数据集! :)

 id <- factor(rep(letters[1:2], each=5))
    A <- c(1,2,NA,67,8,9,0,6,7,9)
    B <- c(5,6,31,9,8,1,NA,9,7,4)
    C <- c(2,3,5,NA,NA,2,7,6,4,6)
    D <- c(6,5,89,3,2,9,NA,12,69,8)
    df <- data.frame(id, A, B,C,D) 
    df
  id  A  B  C  D
1   a  1  5  2  6
2   a  2  6  3  5
3   a NA 31  5 89
4   a 67  9 NA  3
5   a  8  8 NA  2
6   b  9  1  2  9
7   b  0 NA  7 NA
8   b  6  9  6 12
9   b  7  7  4 69
10  b  9  4  6  8 

它应该看起来像:

 id  A  B  C  D
1   a  1  5  2  6
2   a  2  6  3  5
3   a NA NA  5 89
4   a 67  9 NA  3
5   a  8  8 NA  2
6   b  9  1  2  9
7   b  0 NA  7 NA
8   b  6  9  6 12
9   b  7  7  4 NA
10  b  9  4  6  8

最佳答案

另一种解决方案定义要预先保留的值向量(最多只能两位数,但可以扩展):

numerals <- 1:9
vector <- 0:9
for (i in numerals) {
  j <- numerals[i+1]
  if (!is.na(j)) {
    number <- as.numeric(paste(c(i, j), collapse = ""))
    number_reverse <- as.numeric(paste(c(j, i), collapse = ""))
    vector <- c(vector, number, number_reverse)
  }
}

vector
[1]  0  1  2  3  4  5  6  7  8  9 12 21 23 32 34 43 45 54 56 65 67 76 78 87 89 98

如果不在向量中则替换数字的函数:

replace <- function(x) {
  x <- ifelse(!x %in% vector, NA, x)
  return(x)
}

结果:

df %>% mutate_at(c("A", "B", "C", "D"), replace)

   id  A  B  C  D
1   a  1  5  2  6
2   a  2  6  3  5
3   a NA NA  5 89
4   a 67  9 NA  3
5   a  8  8 NA  2
6   b  9  1  2  9
7   b  0 NA  7 NA
8   b  6  9  6 12
9   b  7  7  4 NA
10  b  9  4  6  8

关于r - 使值彼此不相邻 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60949956/

相关文章:

r - 将 R 中的数据帧转换为 'Python dictionary'

html - 如何使用 Shiny 的 html 格式化文本?

java - 使用 Renjin 将 POJO 对象的 ArrayList 转换为 R 数据框

R:返回质因数和指数

r - 你如何从 R 中的文件名中提取日期?

r - 拆分数据表中不同长度的字符串

r - Mutate 以错误的顺序返回数据 dplyr 这是一个错误吗?

r - 在 Shiny 中保存和加载滤镜设置

r - 如何在 nMDS(纯素)中使一个因素显示为符号,而另一个因素显示为颜色?

r - 将字段的上一个和下一个可用值的平均值替换为数据框中的 NA 值