相关疑难解决方法(0)

如何从数据框中删除未使用的级别?

给出以下模拟数据:

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"

r levels

40
推荐指数
2
解决办法
6万
查看次数

按因子过滤后如何删除未使用的级别?

以下是一个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 dplyr

9
推荐指数
2
解决办法
1万
查看次数

R中的幽灵因子水平

可能重复:
在R中的子集化数据帧中丢弃因子级别

我已经用一定的因子水平对观察进行了子集化.当检查是否已经完成时,summary()仍然列出了水平,但没有观察到.它们不应该在子集中消失吗?

r subset r-factor

7
推荐指数
2
解决办法
1957
查看次数

训练数据中不存在新的因子水平

当尝试使用输出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)

r random-forest

5
推荐指数
1
解决办法
5267
查看次数

在过滤R data.frames时更新因子级别

我有一个类似于下面的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)

r dataframe r-factor

4
推荐指数
1
解决办法
5834
查看次数

覆盖[.data.frame以默认删除未使用的因子级别

之前出现子集化时丢弃未使用的因子级别的问题.常见的解决方案包括通过声明尽可能使用字符向量

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 subset dataframe r-factor

3
推荐指数
2
解决办法
1160
查看次数

如何在没有观察结果的情况下降低因子水平?

可能的重复:
在 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 吗?

r r-factor

2
推荐指数
1
解决办法
7849
查看次数

删除未使用的分类值boxplot - R.

我有以下代码:

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)

但这会引发名称大小不正确的错误.在此先感谢您的帮助

r boxplot dataframe

2
推荐指数
1
解决办法
1万
查看次数

在R中使用dplyr进行过滤时,为什么过滤出的变量级别会保留在过滤后的数据中?

我正在尝试使用包中的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)

谢谢你的帮助.

r filter dplyr

2
推荐指数
1
解决办法
3061
查看次数

dplyr和length不是group_by

df%>%
    group_by(variable1)%>%
    summarise(length=length(levels(df$variable2))
Run Code Online (Sandbox Code Playgroud)

group_by不起作用,我对variable1的所有级别都有相同的结果.

r dplyr

0
推荐指数
1
解决办法
95
查看次数

标签 统计

r ×10

r-factor ×4

dataframe ×3

dplyr ×3

subset ×2

boxplot ×1

filter ×1

levels ×1

random-forest ×1