2017-02-09 25 views
4

在R中,我有一個矩陣df和矢量invalidAfterIndex。對於第i行,我想將索引大於invalidAfterIndex[i]的所有元素設置爲NA。例如:大於索引的設置值爲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 

如何爲循環做到這一點沒有?

回答

6

你可以做

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

或者,如@digEmAll建議

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

我無法找到一個愚蠢的,所以張貼... – Frank

+1

或稍微不明顯的''df [col(df)> invalidAfterIndex] < - NA':D(順便說一句,感謝您展示我的功能,這是一個的功能,我可能曾經看過一次,並立即被遺忘) – digEmAll

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