2013-03-21 155 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

相关问题