在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循环,我怎么能这样做?
答案 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