【问题标题】:Remove rows of a dataframe that match a factor level (and then plot the data excluding that factor level)删除与因子级别匹配的数据框行(然后绘制不包括该因子级别的数据)
【发布时间】:2011-03-31 07:33:50
【问题描述】:

我有一个包含 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)
# ---------------------------------------------

【问题讨论】:

  • 这是我避免瘟疫等因素的原因
  • 如果您不想要这种行为,请不要使用因子。

标签: r


【解决方案1】:

您可以使用gdata 包中的drop.levels() 函数将因子水平降低到实际使用的水平——在创建新的data.frame 后将其应用于列。

还可以尝试在此处搜索r and drop.levels(但您需要输入搜索词[r] drop.levels,因为它会干扰格式化逻辑,所以我不能在这里)。

【讨论】:

    【解决方案2】:

    从 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), ] )
    

    【讨论】:

      【解决方案3】:

      我从我的代码中粘贴了一些东西——我在一个湖中进行了一个围场实验——从围场和湖中进行了测量,但大多数情况下不想处理湖: 我的变量被称为“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)
      

      【讨论】:

      • 不错的解决方案,但可以在第一行使用%in% 和在第二行使用droplevels 进行简化。
      猜你喜欢
      • 2012-06-23
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2013-11-26
      相关资源
      最近更新 更多