繁体   English   中英

R-在第一个NA之后用NA替换数据帧行中的所有值

[英]R- Replace all values in rows of dataframe after first NA by NA

我有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

您可以使用applycumsumis.na跟踪其中的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

我们可以使用rowCumsumslibrary(matrixStats)

library(matrixStats)
d*NA^rowCumsums(+(is.na(d)))
#  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

或者base R选项是

d*NA^do.call(cbind,Reduce(`+`,lapply(d, is.na), accumulate=TRUE))

我使用dplyr包中的cumany函数执行此操作,该函数在满足条件后为每个元素返回TRUE

df <- 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 = T)

library(plyr)
library(dplyr)

na_row_replace <- function(x){
  x[which(cumany(is.na(x)))] <- NA
  return(x)
}

adply(df, 1, na_row_replace)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM