2017-10-19 117 views
0

我明白这是一个非常基本的问题,但我不明白是什么水平R.R是什么水平?

供参考的意思是,我做了一个简单的脚本来读取CSV表,过滤器的领域之一,在通过这到一个新变量并清除为第一个变量分配的内存。如果我在过滤的字段上调用unique(),我发现结果确实被过滤了,但是还有一行显示与原始数据集中的数据相对应的“级别”。

例子:

df = read.csv(path, sep=",", header=TRUE) 
df_intrate = df[df$AssetClass == "ASSET CLASS A", ] 

rm(df) 
gc() 

unique(df_intrate$AssetClass) 

结果:

[1] ASSET CLASS A 
Levels: ASSET CLASS E ASSET CLASS D ASSET CLASS C ASSET CLASS B ASSET CLASS A 

df的结构信息以某种方式保存在df_intrate尽管表明df_intrate [R工作室是ASSET CLASS A行的确预计是多少?

+0

请注意,如果您使用'read.csv(path,as.is = TRUE)',那么您将获得字符列代替因子列。还要注意'header = TRUE'和'sep =',''''是'read.csv'的默认值,所以你不必指定它们。 –

回答

1

您在R的数据结构中看到Levels,调用factor。因素是整数类型的:

typeof(as.factor(letters)) 
#[1] "integer" 

然而,它们具有标签,其中每个整数映射到字符规格(标签)。您会看到,在算法需要数字(有时以虚拟变量形式)的模型中,因素通常会有帮助,但在模型解释过程中保留对人类更有意义的标签。

水平是载体的属性:

attributes(as.factor(letters)) 
#$levels 
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" 
#[18] "r" "s" "t" "u" "v" "w" "x" "y" "z" 

#$class 
#[1] "factor" 

这意味着一旦你的子集列仅ASSET CLASS A列的属性得到转移为好。这与你的矢量长度无关,尽管它仍然是[1]

1

R有character类和factor类。 character是您的基本字符串数据结构。 factor对于统计来说很重要:例如,您可能有一个数据集,人们被耳垂的连通性划分(一个重要但常被忽视的区别)。在这种情况下,对于每个人,他们将具有值connectedfree。如果您将模型(例如智能)作为耳垂连接状态的函数,那么您希望该模型了解有两类人:connectedfree,因此您将其表示为factor矢量,并且该载体将具有两个levelsconnectedfree。所以这是语义为什么水平在R.一件事

在语法上,factorcharacter变量as.integer不同的反应。 factor变量转换为与其级别相对应的数字,而character变量更像传统的atoi。一般来说,如果您使用factor变量进行操作,您会遇到很多问题,因为它是character

当我在阅读csv文件时,在大多数情况下,我发现我宁愿有character的值比factors,所以我通常设置read.csv(..., stringsAsFactor=FALSE)。 (YMMV至于这是否是您的一般偏好。)

2

尽管R studio显示df_intrate确实是ASSET CLASS A的预期行数,但df_intrate中是否保留了df的结构信息?

是的。这是变量是如何分类的,被称为因素,被存入R - 无论是水平,所有可能的值的向量,并采取了实际值,存储:

x = factor(c('a', 'b', 'c', 'a', 'b', 'b')) 
x 
# [1] a b c a b b 
# Levels: a b c 

y = x[1] 
# [1] a 
# Levels: a b c 

可以摆脱未使用的水平与droplevels(),或通过重新应用factor功能,创建一个新的因素出来的唯一的东西存在:

droplevels(y) 
# [1] a 
# Levels: a 

factor(y) 
# [1] a 
# Levels: a 

您还可以使用droplevels一个数据帧从所有的因素列删除所有未使用的水平:

dat = data.frame(x = x) 
str(dat) 
# 'data.frame': 6 obs. of 1 variable: 
# $ x: Factor w/ 3 levels "a","b","c": 1 2 3 1 2 2 

str(dat[1, ]) 
# Factor w/ 3 levels "a","b","c": 1 

str(droplevels(dat[1, ])) 
# Factor w/ 1 level "a": 1 

虽然无关,你目前的问题,我们还要提到的是factor有一个可选的参数levels可用于指定一个系数的水平和他们应该去的顺序。如果你想要一个特定的顺序(可能用于绘图或建模),或者如果有更多可能的层次比实际存在的层次并且你想包含它们,这可能很有用。如果您未指定levels,则默认将按字母顺序排列。

x = c("agree", "disagree", "agree", "neutral", "strongly agree") 
factor(x) 
# [1] agree   disagree  agree   neutral  strongly agree 
# Levels: agree disagree neutral strongly agree 
## not a good order 

factor(x, levels = c("disagree", "neutral", "agree", "strongly agree")) 
# [1] agree   disagree  agree   neutral  strongly agree 
# Levels: disagree neutral agree strongly agree 
## better order 

factor(x, levels = c("strongly disagree", "disagree", "neutral", "agree", "strongly agree")) 
# [1] agree   disagree  agree   neutral  strongly agree 
# Levels: strongly disagree disagree neutral agree strongly agree 
## good order, more levels than are actually present 

您可以使用?reorder?relevel(或只是factor再次)更改级别的顺序对已创建的因素。