我有3500个观测数据框和278个变量.对于从第一列开始的每一行,我想用NA替换第一个NA之后出现的所有值.例如,我想从像这样的数据框:
X1 X2 X3 X4 X5 1 3 NA 6 9 1 NA 4 6 18 6 7 NA 3 1 10 1 2 NA 2
喜欢的东西
X1 X2 X3 X4 X5 1 3 NA NA NA 1 NA NA NA NA 6 7 NA NA NA 10 1 2 NA NA
我尝试使用以下嵌套for循环,但它没有终止:
for(i in 2:3500){ firstna <- min(which(is.na(df[i,]))) df[i, firstna:278] <- NA }
有没有更有效的方法来做到这一点?提前致谢.
你可以这样做:
# sample data mat <- matrix(1, 10, 10) set.seed(231) mat[sample(100, 7)] <- NA
您可以使用apply
与cumsum
和is.na
跟踪哪里来港需要放置(即地方在该行地方来港的累计总和大于0).然后,使用这些位置将NA分配给适当位置的原始结构.
mat[t(apply(is.na(mat), 1, cumsum)) > 0 ] <- NA # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] # [1,] 1 1 1 1 1 1 NA NA NA NA # [2,] NA NA NA NA NA NA NA NA NA NA # [3,] 1 1 1 1 1 1 1 1 1 1 # [4,] 1 1 1 1 1 1 1 1 1 1 # [5,] 1 1 1 NA NA NA NA NA NA NA # [6,] 1 1 1 1 1 1 1 1 1 1 # [7,] 1 NA NA NA NA NA NA NA NA NA # [8,] 1 1 1 1 1 1 1 1 1 1 # [9,] 1 1 1 1 1 1 1 1 1 1 #[10,] 1 1 NA NA NA NA NA NA NA NA
使用数据框架可以正常工作.使用提供的示例数据:
d<-read.table(text=" X1 X2 X3 X4 X5 1 3 NA 6 9 1 NA 4 6 18 6 7 NA 3 1 10 1 2 NA 2 ", header=TRUE) d[t(apply(is.na(d), 1, cumsum)) > 0 ] <- NA # X1 X2 X3 X4 X5 #1 1 3 NA NA NA #2 1 NA NA NA NA #3 6 7 NA NA NA #4 10 1 2 NA NA