给出以下模拟数据:
set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T),
num = sample(1:10, 100, replace = T))
y <- subset(x, let != 'a')
Run Code Online (Sandbox Code Playgroud)
创建y$let收益表
a b c d e
0 20 21 22 18
Run Code Online (Sandbox Code Playgroud)
但我不想a再表现出来了.如果我尝试这样做:
levels(y$let) <- factor(y$let)
Run Code Online (Sandbox Code Playgroud)
我弄乱频率,因为现在table(y$let)给了我
b d c e
0 20 21 40
Run Code Online (Sandbox Code Playgroud)
我知道我可以做到xtabs(~ y$let, drop.unused.levels = T)并解决这个问题,但它并没有重置核心的变量级别(这对我很重要,因为这是我对数据集的一个早期改变,它将继续贯穿始终整个分析).而且,这xtabs是一个不同的类table,这将使我在项目后期头痛.
问题是:我如何自动更改,levels(y$let)以便它不显示创建子集时丢弃的级别?在这种情况下,我该如何展示[1] "b" "c" "d" "e"?
以下是一个SO成员的例子.
# define a %not% to be the opposite of %in%
library(dplyr)
# data
f <- c("a","a","a","b","b","c")
s <- c("fall","spring","other", "fall", "other", "other")
v <- c(3,5,1,4,5,2)
(dat0 <- data.frame(f, s, v))
# f s v
#1 a fall 3
#2 a spring 5
#3 a other 1
#4 b fall 4
#5 b other 5
#6 c other 2
(sp.tmp <- filter(dat0, s == "spring"))
# f s v
#1 a spring 5
(str(sp.tmp))
#'data.frame': 1 obs. of …Run Code Online (Sandbox Code Playgroud) 可能重复:
在R中的子集化数据帧中丢弃因子级别
我已经用一定的因子水平对观察进行了子集化.当检查是否已经完成时,summary()仍然列出了水平,但没有观察到.它们不应该在子集中消失吗?
当尝试使用输出randomForest来分类新数据(甚至原始训练数据)时,我收到以下错误:
> res.rf5 <- predict(model.rf5, train.rf5)
Error in predict.randomForest(model.rf5, train.rf5) :
New factor levels not present in the training data
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?为什么即使我尝试预测用于训练的相同数据时也会发生此错误?
下面是一个可用于重现错误的小例子.
train.rf5 <- structure(
list(A = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 1L, 3L),
.Label = c("(-0.1,19.9]", "(19.9,40]", "(80.1,100]"),
class = c("ordered", "factor")),
B = structure(c(3L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 4L),
.Label = c("1", "2", "4", "5"),
class = c("ordered", "factor")),
C = structure(c(1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, …Run Code Online (Sandbox Code Playgroud) 我有一个类似于下面的data.frame.我通过删除我不感兴趣的行来预处理它.我的大多数列是'因素',其'级别'不会更新,因为我过滤data.frame.
我可以看到我在下面做的事情并不理想.在修改data.frame时如何更新因子级别?下面是出现问题的演示.
# generate data
set.seed(2013)
df <- data.frame(site = sample(c("A","B","C"), 50, replace = TRUE),
currency = sample(c("USD", "EUR", "GBP", "CNY", "CHF"),50, replace=TRUE, prob=c(10,6,5,6,0.5)),
value = ceiling(rnorm(50)*10))
# check counts to see there is one entry where currency = CHF
count(df, vars="currency")
>currency freq
>1 CHF 1
>2 CNY 13
>3 EUR 16
>4 GBP 6
>5 USD 14
# filter out all entires where site = A, i.e. take subset of df
df <- df[!(df$site=="A"),]
# check counts again …Run Code Online (Sandbox Code Playgroud) 之前出现子集化时丢弃未使用的因子级别的问题.常见的解决方案包括通过声明尽可能使用字符向量
options(stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
但有时候,有序因素对于绘图是必要的,在这种情况下我们可以使用便利函数droplevels来创建一个包装器subset:
subsetDrop <- function(...){droplevels(subset(...))}
Run Code Online (Sandbox Code Playgroud)
我意识到这subsetDrop主要解决了这个问题,但是在某些情况下,子集化via [更方便(而且输入更少!).
我的问题是,为了方便起见,我们可以通过覆盖[数据帧以自动降低因子水平来推动它成为R的"默认"行为.例如,Hmisc包中包含dropUnusedLevels哪些覆盖[.factor用于对单个因子进行子集化(不再需要,因为默认值[.factor似乎具有drop用于删除未使用级别的参数).我正在寻找一种类似的解决方案,它允许我使用数据帧进行子集化,[但会自动丢弃未使用的因子级别(当然,在有序因子的情况下保留顺序).
可能的重复:
在 R 中的子集数据框中删除因子级别
我有一个包含多个变量的数据框,我正在使用它运行混合模型lme()。其中一个变量 ForAgeCat 有五个因子水平:1、2、3、4、5。
str(mvthab.3hr.fc$ForAgeCat)
>Factor w/ 5 levels "1","2","3","4",..: 5 5 5 5 5 5 5 5 5 5 ...
Run Code Online (Sandbox Code Playgroud)
问题是因子级别 3 实际上不存在,也就是说,在这个数据集(这是一个较大数据集的子集)中没有来自因子级别 3 的观察结果,我认为这扰乱了我在 lme() 中的建模。有人可以帮我从因子级别列表中删除/消除因子级别 3 吗?
我有以下代码:
x = rnorm(30, 1, 1)
c = c(rep("x1",10), rep("x2",10), rep("x3",10))
df = dataframe(x,c)
boxplot(x ~ c, data=df)
Run Code Online (Sandbox Code Playgroud)
它很棒.但如果我决定不再对看到x3感兴趣,请删除它,并重新绘制:
dfMod = subset(df, c %in% c("x1", "x2"))
boxplot(x ~ c,data=dfMod)
Run Code Online (Sandbox Code Playgroud)
boxplot仍然显示x3的列.

香港专业教育学院尝试使用boxplot提示
boxplot(x~c,data=dfMod, names = c("x1", "x2"))
Run Code Online (Sandbox Code Playgroud)
但这会引发名称大小不正确的错误.在此先感谢您的帮助
我正在尝试使用包中的filter命令过滤掉一堆数据dplyr.一切看起来都像我希望的那样,但是当我尝试从新过滤的数据中绘制一些图表时,我过滤掉的所有级别都显示出来(尽管没有值).但是他们在那里的事实仍然在抛弃我的水平轴.
所以有两个问题:
1)为什么这些过滤的级别仍在数据中?
2)如何过滤使这些不再存在?
这是一个小例子,您可以运行以查看我在说什么:
library(dplyr)
library(ggvis)
# small example frame
data <- data.frame(
x = c(1:10),
y = rep(c("yes", "no"), 5)
)
# filtering to only include data with "yes" in y variable
new_data <- data %>%
filter(y == "yes")
levels(new_data) ## Why is "no" showing up as a level for this if I've filtered that out?
# Illustration of the filtered values still showing up on axis
new_data %>%
ggvis(~y, ~x) %>%
layer_bars()
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
df%>%
group_by(variable1)%>%
summarise(length=length(levels(df$variable2))
Run Code Online (Sandbox Code Playgroud)
group_by不起作用,我对variable1的所有级别都有相同的结果.