猿问
下载APP

在子设置的数据帧中降低因子级别

在子设置的数据帧中降低因子级别

我有一个包含因子的数据框架。当我创建此数据框架的子集时,使用subset()或者另一个索引函数,创建一个新的数据框架。然而,因子变量保留了所有的原始级别-即使它们不存在于新的数据框架中。


这会在进行分面绘图或使用依赖于因素级别的函数时造成头痛。


在我的新数据框架中,从一个因素中删除级别的最简洁的方法是什么?


下面是我的例子:


df <- data.frame(letters=letters[1:5],

                    numbers=seq(1:5))


levels(df$letters)

## [1] "a" "b" "c" "d" "e"


subdf <- subset(df, numbers <= 3)

##   letters numbers

## 1       a       1

## 2       b       2

## 3       c       3    


## but the levels are still there!

levels(subdf$letters)

## [1] "a" "b" "c" "d" "e"


缥缈止盈
浏览 67回答 4
4回答

幕布斯6054654

您所要做的就是在插入之后再次将factor()应用于变量:>&nbsp;subdf$letters[1]&nbsp;a&nbsp;b&nbsp;c Levels:&nbsp;a&nbsp;b&nbsp;c&nbsp;d&nbsp;e subdf$letters&nbsp;<-&nbsp;factor(subdf$letters)>&nbsp;subdf$letters[1]&nbsp;a&nbsp;b&nbsp;c Levels:&nbsp;a&nbsp;b&nbsp;c编辑从“因素”页面示例中:factor(ff)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;drops&nbsp;the&nbsp;levels&nbsp;that&nbsp;do&nbsp;not&nbsp;occur要从Dataaframe中的所有因素列中删除级别,可以使用:subdf&nbsp;<-&nbsp;subset(df,&nbsp;numbers&nbsp;<=&nbsp;3)subdf[]&nbsp;<-&nbsp;lapply(subdf,&nbsp;function(x)&nbsp;if(is.factor(x))&nbsp;factor(x)&nbsp;else&nbsp;x)

慕的地6264312

从R版本2.12开始,就有一个droplevels()功能。levels(droplevels(subdf$letters))

侃侃尔雅

如果您不想要这种行为,不要使用因素,而是使用字符向量。我认为这比事后修补更有意义。在用read.table或read.csv:options(stringsAsFactors&nbsp;=&nbsp;FALSE)缺点是你只能按字母顺序排序。(重新排序是你策划阴谋的朋友)

慕姐8265434

这是一个已知的问题,一个可能的补救办法是drop.levels()在Gdata将您的示例打包为>&nbsp;drop.levels(subdf) &nbsp;&nbsp;letters&nbsp;numbers1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3>&nbsp;levels(drop.levels(subdf)$letters)[1]&nbsp;"a"&nbsp;"b"&nbsp;"c"还有dropUnusedLevels函数中的赫米斯克包裹。但是,它只能通过修改子集运算符来工作。[在这里不适用。作为推论,以每列为基础的直接方法是一个简单的方法。as.factor(as.character(data)):>&nbsp;levels(subdf$letters)[1]&nbsp;"a"&nbsp;"b"&nbsp;"c"&nbsp;"d"&nbsp;"e">&nbsp;subdf$letters&nbsp;<-&nbsp;as.factor(as.character(subdf$letters))>&nbsp;levels(subdf$letters)[1]&nbsp;"a"&nbsp;"b"&nbsp;"c"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

R语言
我要回答