有没有一种有效的方法来检查大型数据集的每一列中 8 个不是 NA 的连续元素(即 is.na()==FALSE)?



我有 200 个大小为 5120*732 的数据集,我将它们保存在列表类型的变量"data"中。 一些元素是NA。

例如,第 13 列和第 14 列是:


... 13 14 ...
... 13 14 ...
... NA 14 ...
... NA 14 ...
... 13 14 ...
... 13 14 ...
... 13 14 ...
... 13 14 ...
... 13 14 ...
... 13 14 ...

现在在第 12 列(即从第 13 列开始(之后的每一列中,一旦有>= N1 (N1 = 8( 个不是 NA 的连续元素(即 is.na((==FALSE(,我想用"D"作为它们前面的前缀。

喜欢:


... 13 D14 ...
... 13 D14 ...
... NA D14 ...
... NA D14 ...
... 13 D14 ...
... 13 D14 ...
... 13 D14 ...
... 13 D14 ...
... 13 D14 ...
... 13 D14 ...

这是我的代码:

for (i in 1:length(data)) { #traverse List"data"
for (j in 1:dim(data[[i]])[1]) { #traverse each row
for (k in 13:dim(data[[i]])[2]) { #traverse each column
#Here N1 = 8
if((j+N1-1)<=dim(data[[i]])[1] && sum(is.na(data[[i]][j:(j+N1-1),k])==FALSE)==N1) {
data[[i]][j:(j+N1-1),k] <- paste('D', data[[i]][j:(j+N1-1),k], sep = '')
}
} 
}
}

它适用于小型数据集,但对于大型数据集来说太慢了。

有没有一种有效的方法来检查大型数据集的每一列中 8 个不是 NA 的连续元素(即 is.na((==FALSE(?

提前谢谢你!

我尝试了apply((函数,但我不知道如何完成它。

for (i in 1:length(data)) {  
apply(data[[i]][,13:732], MARGIN = c(1,2),function(x){
})
}

@RonakShah,这里有一个例子(N1 = 3,10行* 10列(,如果您需要更多信息,请告诉我。

原始数据: ========================>预期结果:

1  2  3  4  5  6  7  8  9  10      1  2  D3  D4  5  6   D7  D8  D9  D10  
NA 2  3  4  5  6  7  8  9  10      NA 2  D3  D4  5  6   D7  D8  D9  D10  
1  NA 3  4  NA NA 7  8  9  10      D1 NA D3  D4  NA NA  D7  D8  D9  D10  
1  NA 3  4  5  6  7  8  9  10      D1 NA D3  D4  5  6   D7  D8  D9  D10  
1  NA 3  4  NA NA 7  8  NA NA ===> D1 NA D3  D4  NA NA  D7  D8  NA  NA
NA NA 3  4  5  6  7  8  9  NA      NA NA D3  D4  5  D6  D7  D8  D9  NA
NA NA 3  4  5  6  7  8  9  NA      NA NA D3  D4  5  D6  D7  D8  D9  NA
1  NA 3  4  NA 6  7  8  9  NA      1  NA D3  D4  NA D6  D7  D8  D9  NA
1  NA 3  4  NA 6  7  8  9  NA      1  NA D3  D4  NA D6  D7  D8  D9  NA
NA NA 3  4  5  6  7  8  9  NA      NA NA D3  D4  5  D6  D7  D8  D9  NA

以下代码执行问题要求的操作。
完成所有工作的功能是append_one.它

  1. 创建Y将前缀重复length(x)次的向量。
  2. 获取向量y的运行。
  3. 运行值清理为空字符串""如果运行的长度小于N
  4. 反转运行长度编码。
  5. 将此前缀向量
  6. 与输入向量粘贴x

然后,函数append_all在输入数据帧的每一列上调用此函数。

append_one <- function(x, N, pref = "D"){
y <- rep(pref, length(x))
is.na(y) <- is.na(x)
r <- rle(y)
r$values[r$lengths < N] <- ""
y <- inverse.rle(r)
paste0(y, x)
}
append_all <- function(X, n, pref = "D"){
Y <- X
Y [] <- lapply(Y, append_one, N = n, pref = pref)
Y
}
N1 <- 3
append_all(df1, N1)

数据。

原始数据集,发布在问题中。

df <- data.frame(c(1,NA,1,1,1),
c(2,2,NA,NA,NA),
c(3,3,3,3,NA),
c(4,4,4,4,4),
c(5,NA,5,NA,5))

新数据集和相应的输出,发布在评论中。

df1 <- data.frame(c(1.0,NA,1.1,1.2,1.3),
c(2.0,2.1,NA,NA,NA),
c(3.0,3.1,3.2,3.3,NA),
c(4.0,4.1,4.2,4.3,4.4),
c(5.0,NA,5.1,NA,5.2))
df2 <- data.frame(c(1.0,NA,'D1.1','D1.2','D1.3'),
c(2.0,2.1,NA,NA,NA),
c('D3.0','D3.1','D3.2','D3.3',NA),
c('D4.0','D4.1','D4.2','D4.3','D4.4'),
c(5.0,NA,5.1,NA,5.2))

最新更新