我有一个包含因子的数据框.当我使用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中的一种基本数据类型是因子.根据我的经验,因素基本上是一种痛苦,我从不使用它们.我总是转换为角色.我觉得奇怪的是我错过了一些东西.
是否有一些重要的函数示例使用因子作为分组变量,其中因子数据类型变得必要?我应该使用哪些因素?
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)
所以,我的问题包括两部分:
关卡和标签有什么区别?
脚本和输出的因子级别是否可以有不同的名称?
背景:对于较长的脚本,使用较短因子级别的脚本似乎要容易得多.但是,对于报告和图表,这个较短的因子水平可能不够,应该用精简者名称替换.
我有一个大型数据框(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的新手,我无法访问我导入的数据集.我正在使用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)
但是,数据不是我所习惯的整数或数字,而是因素,所以当我尝试绘制变量时,我只得到直方图,而不是通常的情节.当检查数据时,它似乎是有序的,只是我无法使用它,因为它是因子形式.
我有一个如下所示的示例数据框:
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)
.但是当数据框非常大并且包含大量列时,这种方式将非常耗时.有谁知道更好的方法吗?
我最近看到马特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会将因子强制转换为数字.即使水平相同,也会发生这种情况.例如:
> 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中执行此操作的惯用方法是什么(在我的情况下,这些向量可能非常大)?谢谢.
下面的绘图代码给出了 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) 我想采用带有字符和数字的数据框,并将每行的所有元素连接成一个字符串,该字符串将作为单个元素存储在向量中.作为一个例子,我创建一个字母和数字的数据框,然后我想通过粘贴函数连接第一行,并希望返回值"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
似乎对我的尝试没有帮助
谁能解释这种行为?