2010-08-18 34 views
4

我有一個包含251個觀測值和45個變量的數據幀。數據框中間有6個觀察值,我想從我的分析中排除。所有6個屬於一個因素的一個級別。生成一個新的數據框很容易,在打印時,似乎排除了6個觀察值。然而,當我使用新的數據框根據有問題的因子繪製變量時,據推測排除的水平仍然包含在圖中(無觀測值)。使用str()確認該級別仍然以某種形式存在。此外,新數據幀的索引將跳過以前駐留觀測值的6個值。刪除與因子級別匹配的數據幀的行(然後繪製除該因子級別之外的數據)

如何創建一個排除6個觀察值的新數據框,並且在繪圖時不會繼續識別排除的因子水平?新數據框是否可以「重新編制索引」,以便新索引不會跳過以前分配到排除因子級別的值?

我提供了一個例子與由數據:

# --------------------------------------------- 
# data 
char <- c(rep("anc", 4), rep("nam", 3), rep("oom", 5), rep("apt", 3)) 
a <- 1:15/pi 
b <- seq(1, 8, .5) 
d <- rep(c(3, 8, 5), 5) 
dat <- data.frame(char, a, b, d) 
dat 

# two ways to remove rows that contain a string 
datNew1 <- dat[-which(dat$char == "nam"), ] 
datNew1 
datNew2 <- dat[grep("nam", dat[ ,"char"], invert=TRUE), ] 
datNew2 

# plots still contain the factor level that was excluded 
boxplot(datNew1$a ~ datNew1$char) 
boxplot(datNew2$a ~ datNew2$char) 

# str confirms that it's still there 
str(datNew1) 
str(datNew2) 
# --------------------------------------------- 
+0

這是一個原因,我避免的因素像瘟疫 – 2010-08-18 02:37:49

+1

如果不希望這種行爲,不使用的因素。 – hadley 2010-08-18 12:16:32

回答

8

可以使用drop.levels()功能從gdata包,以減少因子水平下降到實際使用的 - 它適用於你的專欄在創建新的data.frame後。

另請嘗試在這裏搜索r and drop.levels(但您需要使搜索項[r] drop.levels,我不能在這裏,因爲它干擾格式化邏輯)。

0

我從我的代碼中粘貼了一些東西 - 我在湖中進行了封閉實驗 - 從封閉和湖中測量,但大多數都不想處理湖泊: 我的變量被稱爲「t.level」,水平爲對照,低,中高,享有湖景 - 該代碼使得可以使用nolk $或數據= nolk不帶「湖」,以獲取數據..

nolk<-subset(mylakedata,t.level == "control" | 
         t.level == "low" | 
         t.level == "medium" | 
         t.level=="high") 

nolk[]<-lapply(nolk, function(t.level) if(is.factor(t.level)) 
             t.level[drop=T] 
             else t.level) 
+1

不錯的解決方案,雖然可以用第一行中的'%in%'和第二行中的'droplevels'來簡化。 – Aaron 2011-06-16 14:22:28

1

有R版本2.12.0開始,有一個函數droplevels,它可以應用於因子列或整個數據幀。應用於數據框時,它將從所有因子列中移除零計數級別。所以,你的例子會變得簡單:

# two ways to remove rows that contain a string 
datNew1 <- droplevels(dat[-which(dat$char == "nam"), ]) 
datNew2 <- droplevels(dat[grep("nam", dat[ ,"char"], invert=TRUE), ])