将大于索引的值设置为每行NA

时间:2017-02-09 19:48:36

标签: r

在R中,我有一个矩阵df和一个向量invalidAfterIndex。对于i行,我想将索引大于invalidAfterIndex[i]的所有元素设置为NA。例如:

> df <- data.frame(matrix(rnorm(20), nrow=5))
> df
            X1         X2         X3          X4
1  2.124042819 -0.2862224  0.1686977  2.14838198
2  0.777763004  0.2949123 -0.4331421 -0.81278586
3 -0.003226624 -0.2326152 -1.5779695 -1.23193913
4  0.165975919 -0.1879981 -0.8214994 -1.40267202
5  1.299195865 -0.9418217 -1.5302512  0.03164781
> invalidAfterIndex <- c(2,3,1,4,1)

我想:

            X1         X2         X3          X4
1  2.124042819 -0.2862224  NA         NA
2  0.777763004  0.2949123 -0.4331421  NA
3 -0.003226624  NA         NA         NA
4  0.165975919 -0.1879981 -0.8214994 -1.40267202
5  1.299195865  NA         NA         NA

如果没有for循环,我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

你可以做到

is.na(df) <- col(df) > invalidAfterIndex

或者,正如@digEmAll建议的那样

df[col(df) > invalidAfterIndex] <- NA

答案 1 :(得分:0)

以下是Map的一个选项,您可以使用该选项将列和列位置传递给一个函数,您可以使用NA替换带有超过invalidAfterIndex的索引的元素:

df[] <- Map(function(col, index) replace(col, index > invalidAfterIndex, NA), df, seq_along(df))

df
#            X1         X2         X3        X4
#1  2.124042819 -0.2862224         NA        NA
#2  0.777763004  0.2949123 -0.4331421        NA
#3 -0.003226624         NA         NA        NA
#4  0.165975919 -0.1879981 -0.8214994 -1.402672
#5  1.299195865         NA         NA        NA