标签: r-factor

子集化数据帧中的丢弃因子级别

我有一个包含因子的数据框.当我使用factor或另一个索引函数创建此数据框的子集时,会创建一个新的数据框.但是,因子变量保留其所有原始级别 - 即使它们不存在于新数据框中.

这在进行分面绘图或使用依赖于因子水平的函数时会产生麻烦.

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

这是我的例子:

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    

# all levels are still there!
levels(subdf$letters)
## [1] "a" "b" "c" "d" "e"
Run Code Online (Sandbox Code Playgroud)

r dataframe r-faq r-factor

510
推荐指数
11
解决办法
36万
查看次数

R中的因素:不仅仅是烦恼?

R中的一种基本数据类型是因子.根据我的经验,因素基本上是一种痛苦,我从不使用它们.我总是转换为角色.我觉得奇怪的是我错过了一些东西.

是否有一些重要的函数示例使用因子作为分组变量,其中因子数据类型变得必要?我应该使用哪些因素?

language-design r internals r-factor

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

因子水平和因子标签之间的混淆

R中因子的级别和标签之间似乎存在差异.到目前为止,我一直认为级别是因子级别的"真实"名称,标签是用于输出的名称(例如表格和图表) .显然,情况并非如此,如下例所示:

df <- data.frame(v=c(1,2,3),f=c('a','b','c'))
str(df)
'data.frame':   3 obs. of  2 variables:
 $ v: num  1 2 3
 $ f: Factor w/ 3 levels "a","b","c": 1 2 3

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
levels(df$f)
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"
Run Code Online (Sandbox Code Playgroud)

我认为在脚本编写时仍可以以某种方式访问​​级别('a','b','c'),但这不起作用:

> df$f=='a'
[1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

但这样做:

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

所以,我的问题包括两部分:

  • 关卡和标签有什么区别?

  • 脚本和输出的因子级别是否可以有不同的名称?

背景:对于较长的脚本,使用较短因子级别的脚本似乎要容易得多.但是,对于报告和图表,这个较短的因子水平可能不够,应该用精简者名称替换.

r r-faq r-factor

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

将具有看不见的字符串值的新记录附加到数据帧时看不见的因子级别,导致警告并导致NA

我有一个大型数据框(14552行乘15列),包含2001年至2007年的计费数据.我使用sqlFetch获取2008年的数据.为了将2008年数据附加到前7年的数据,可以如下进行

alltime <- rbind(alltime,all2008)

不幸的是,生成

警告消息:In alltime <- rbind(alltime,all2008)(alltime <- rbind(alltime,all2008),ri,value = c(NA,NA,NA,NA,NA,NA,NA,:无效因子级别,生成的NAs)

我的猜测是,有一些新病人的名字不在之前的数据框中,因此不知道给它的级别.类似于推荐医生专栏中新的看不见的名字.

R导入数据并自动计算出数字和非数据的方式(从而使其成为一个因素)很棒 - 直到你必须进一步操纵它然后它变得很痛苦.我如何优雅地克服我的问题?

r append dataframe r-factor

66
推荐指数
3
解决办法
10万
查看次数

将csv-dataset导入R但值变为因子

我是R的新手,我无法访问我导入的数据集.我正在使用RStudio并在导入我的csv文件时使用了导入数据集功能,并将该行从控制台窗口粘贴到源窗口.代码如下:

setwd("c:/kalle/R")
stuckey <- read.csv("C:/kalle/R/stuckey.csv")
point <- stuckey$PTS
time <- stuckey$MP
Run Code Online (Sandbox Code Playgroud)

但是,数据不是我所习惯的整数或数字,而是因素,所以当我尝试绘制变量时,我只得到直方图,而不是通常的情节.当检查数据时,它似乎是有序的,只是我无法使用它,因为它是因子形式.

r r-factor read.csv

60
推荐指数
4
解决办法
14万
查看次数

一次将多个列强制转换为因子

我有一个如下所示的示例数据框:

data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10])))
Run Code Online (Sandbox Code Playgroud)

我想知道如何选择多个列并将它们一起转换为因子.我通常会这样做data$A = as.factor(data$A).但是当数据框非常大并且包含大量列时,这种方式将非常耗时.有谁知道更好的方法吗?

r dataframe r-factor

58
推荐指数
6
解决办法
7万
查看次数

为什么使用as.factor()而不仅仅是因子()

我最近看到马特Dowle写一些代码as.factor(),特别是

for (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]]))
Run Code Online (Sandbox Code Playgroud)

对这个答案的评论中.

我使用了这个片段,但是我需要明确设置因子级别以确保级别以我想要的顺序出现,所以我不得不改变

as.factor(dt[[col]])
Run Code Online (Sandbox Code Playgroud)

factor(dt[[col]], levels = my_levels)
Run Code Online (Sandbox Code Playgroud)

这让我想到:什么(如果有的话)是使用as.factor()与仅仅的好处factor()

r r-factor

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

如何连接因子,而不将它们转换为整数级别?

我很惊讶地发现,当连接向量时,R会将因子强制转换为数字.即使水平相同,也会发生这种情况.例如:

> facs <- as.factor(c("i", "want", "to", "be", "a", "factor", "not", "an", "integer"))
> facs
[1] i       want    to      be      a       factor  not     an      integer
Levels: a an be factor i integer not to want
> c(facs[1 : 3], facs[4 : 5])
[1] 5 9 8 3 1
Run Code Online (Sandbox Code Playgroud)

在R中执行此操作的惯用方法是什么(在我的情况下,这些向量可能非常大)?谢谢.

r concatenation r-factor

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

用ggplot2绘图:"分类y轴上的误差:提供给连续刻度的离散值"

下面的绘图代码给出了 Error: Discrete value supplied to continuous scale

这段代码出了什么问题?它工作正常,直到我尝试更改比例,所以错误就在那里......我试图找出类似问题的解决方案,但不能.

这是head我的数据:

> dput(head(df))
structure(list(`10` = c(0, 0, 0, 0, 0, 0), `33.95` = c(0, 0, 
0, 0, 0, 0), `58.66` = c(0, 0, 0, 0, 0, 0), `84.42` = c(0, 0, 
0, 0, 0, 0), `110.21` = c(0, 0, 0, 0, 0, 0), `134.16` = c(0, 
0, 0, 0, 0, 0), `164.69` = c(0, 0, 0, 0, 0, 0), `199.1` = c(0, 
0, 0, 0, 0, 0), `234.35` = …
Run Code Online (Sandbox Code Playgroud)

r scale ggplot2 categorical-data r-factor

36
推荐指数
3
解决办法
13万
查看次数

连接数据帧的行

我想采用带有字符和数字的数据框,并将每行的所有元素连接成一个字符串,该字符串将作为单个元素存储在向量中.作为一个例子,我创建一个字母和数字的数据框,然后我想通过粘贴函数连接第一行,并希望返回值"A1"

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

##   letters numbers
## 1       A       1
## 2       B       2
## 3       C       3
## 4       D       4
## 5       E       5

paste(df[1,], sep =".")
## [1] "1" "1"
Run Code Online (Sandbox Code Playgroud)

因此,粘贴将行的每个元素转换为一个整数,该整数对应于"相应级别的索引",就像它是一个因子一样,并且它保持长度为2的向量.(我知道/相信被强制为字符的因素会以这种方式运行,但由于R根本没有存储df [1,]作为因素(由is.factor()测试,我无法验证它实际上是一个级别的索引)

is.factor(df[1,])
## [1] FALSE
is.vector(df[1,])
## [1] FALSE
Run Code Online (Sandbox Code Playgroud)

因此,如果它不是一个向量,那么它的行为很奇怪,但我无法将它强制转换为向量

> is.vector(as.vector(df[1,]))
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

使用as.character似乎对我的尝试没有帮助

谁能解释这种行为?

r vector concatenation paste r-factor

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