首页 > 解决方案 > 使值彼此不相邻 NA

问题描述

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

 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

标签: r

解决方案


这是一个测试单个数字的函数

MyFunction <- function(A){
  NumbersToCheck <- lapply(strsplit(as.character(A),""),as.integer)
  check <- lapply(2:length(unlist(NumbersToCheck)), function(X) ifelse(NumbersToCheck[[1]][X]-NumbersToCheck[[1]][X-1]==1,TRUE,FALSE))
  return(ifelse(FALSE %in% check,NA,A))
}

然后可以将其应用于您的整个 df 如下

df[,2:ncol(df)] <- lapply(2:ncol(df),  function(X) unlist(lapply(df[,X],MyFunction)))

得到以下结果

> df
   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

推荐阅读