我有一个包含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 :(得分:8)
您可以使用gdata包中的drop.levels()
功能将因子级别降低到实际使用的级别 - 在创建新data.frame
后将其应用于列。
此处也尝试搜索r and drop.levels(但您需要创建搜索字词[r] drop.levels
,因为它会干扰格式化逻辑,因此我无法在此处搜索。)
答案 1 :(得分: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), ] )
答案 2 :(得分:0)
我从我的代码中粘贴了一些东西 - 我在湖中进行了一次封闭测试 - 从外壳和湖中进行测量但是大多数人都不想处理湖泊: 我的变量被称为“t.level”,水平是控制,低中高和湖泊 - - 这个代码可以使用nolk $或data = 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)