2013-03-21 154 views
-1

我想用所有ART == '999'只在列L1:L8記錄替換所有值99NA。我知道如何一次執行一次這樣的操作,但我希望對一個命令中的所有列更有效地執行此操作。如何根據條件替換多列中的值?

樣本數據:

df <- structure(list(KARTA = c("02C2H", "02C2H", "02C2H", "02C2H", 
"02C2H", "02C2H", "02C2H", "02C2H", "02C2H", "02C2H", "02C2H", 
"02C2H", "02C2H", "02C7H", "02C7H", "02C7H", "02C7H", "02C7H", 
"02C7H", "02C7H", "02C7H", "02C7H", "02C7H", "02C7H", "02C7H" 
), YEAR = c(1997L, 1999L, 2000L, 2001L, 2002L, 2003L, 2005L, 
2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 1997L, 1998L, 2000L, 
2001L, 2002L, 2003L, 2004L, 2006L, 2008L, 2009L, 2010L, 2011L 
), ART = c("999", "999", "100", "100", "100", "999", "999", "999", 
"999", "999", "999", "999", "999", "999", "999", "999", "999", 
"999", "999", "999", "999", "999", "999", "999", "999"), L1 = c(99, 
99, 99, 99, 99, 10, 10, 10, 10, 10, 10, 10, 10, 99, 99, 99, 99, 
99, 10, 10, 10, 10, 10, 10, 10), L2 = c(99, 99, 99, 99, 99, 10, 
10, 10, 10, 10, 10, 10, 10, 99, 99, 99, 99, 99, 10, 9, 10, 10, 
10, 10, 10), L3 = c(99, 99, 99, 99, 99, 7, 10, 10, 10, 10, 10, 
10, 10, 99, 99, 99, 99, 99, 10, 10, 10, 10, 10, 10, 10), L4 = c(99, 
99, 99, 99, 99, 10, 10, 10, 10, 10, 10, 10, 10, 99, 99, 99, 99, 
99, 10, 10, 8, 7, 7, 10, 8), L5 = c(99, 99, 99, 99, 99, 5, 8, 
10, 10, 10, 10, 10, 10, 99, NA, 99, 99, 99, 10, 10, 7, 7, 0, 
10, 8), L6 = c(99, 99, 99, 99, 99, 8, 10, 10, 10, 10, 10, 10, 
10, 99, 99, 99, 99, 99, 10, 9, 10, 10, 10, 10, 10), L7 = c(99, 
99, 99, 99, 99, 10, 10, 10, 10, 10, 10, 8, 10, 99, 99, 99, 99, 
99, 10, 10, 10, 10, 10, 10, 10), L8 = c(99, 99, 99, 99, 99, 10, 
10, 10, 10, 10, 10, 10, 10, 99, 99, 99, 99, 99, 10, 10, 6, 10, 
10, 10, 10)), .Names = c("KARTA", "YEAR", "ART", "L1", "L2", 
"L3", "L4", "L5", "L6", "L7", "L8"), row.names = c(161008L, 161009L, 
161010L, 161011L, 161012L, 87055L, 106223L, 128072L, 160909L, 
172583L, 208774L, 45L, 227972L, 161013L, 161014L, 161015L, 161016L, 
161017L, 71813L, 89034L, 139633L, 181266L, 208838L, 97L, 225989L 
), class = "data.frame") 

如何在一個單一的柱( 'L1')

df[which(df$ART == '999' & df$L1 == '99'), ] <- NA 
+1

您近距離了。 'df [df == 999 | df == 99] < - NA'(注意無逗號)。 – 2013-03-21 07:32:58

+0

並注意or('|')而不是'&'。 – Arun 2013-03-21 07:34:06

+0

我比較接近,但是當我使用您的代碼時,'ART'列中的'999'也被替換爲'NA'。我只想替換字段'L1:L8'。 – 2013-03-21 07:38:30

回答

6

在您的示例數據ART替換值實施例始終是999,但我認爲是並非總是如此,並且您只想在ART==999的那些行中替換99NA,即可以這樣完成:

df$ART[3:5]<-100 #just to give some difference 
df[df$ART==999, 4:10][df[df$ART==999,4:10] == 99] <- NA 

     KARTA YEAR ART L1 L2 L3 L4 L5 L6 L7 L8 
161008 02C2H 1997 999 NA NA NA NA NA NA NA 99 
161009 02C2H 1999 999 NA NA NA NA NA NA NA 99 
161010 02C2H 2000 100 99 99 99 99 99 99 99 99 
161011 02C2H 2001 100 99 99 99 99 99 99 99 99 
161012 02C2H 2002 100 99 99 99 99 99 99 99 99 
87055 02C2H 2003 999 10 10 7 10 5 8 10 10 
... 
+0

我在我的問題中編輯了數據集,以確保字段'ART'有多個值。謝謝你的幫助! – 2013-03-21 08:28:09

相關問題