为什么在我对数据帧进行子集时会返回一个因子?

时间:2015-07-11 20:14:14

标签: r dataframe factors

我仍然是R编程的新手。我很困惑为什么数据帧的子集返回一个因子而不是只有一个元素的向量。为什么这个R是默认的?这是因为我的子集是一个单词,而不是一个值?不过,我还是期待一个角色矢量。

例如:

n <- c(2,3,5)
s = c("aa", "bb","cc")
b <- c(TRUE, FALSE, TRUE)
df <- data.frame(n,s,b)
df

test <- df[1,"s"]
test
class(test)  #this says it's a factor

谢谢!

4 个答案:

答案 0 :(得分:4)

默认情况下,data.frame()函数会将字符向量转换为因子。如果您不想要此行为,请使用data.frame(..., stringsAsFactors=FALSE)

另请注意,R没有&#34;单个值,&#34;它只有矢量。即使数字1也只是一个长度为一的数字向量。

答案 1 :(得分:2)

请参阅?data.frame。一个默认设置data.frame()是将字符向量(例如s = c("aa", "bb","cc"))转换为因子。要更改此设置,您需要将参数stringsAsFactors从默认的TRUE修改为FALSE

以下是修改代码的方法:

n <- c(2,3,5)
s = c("aa", "bb","cc")
b <- c(TRUE, FALSE, TRUE)
df <- data.frame(n,s,b, stringsAsFactors = FALSE)
df

test <- df[1,"s"]
test
class(test)  #Now returns character.

答案 2 :(得分:1)

实际上test不是矢量,即使只有一个元素。它具有属性levelsclass属性,可将其标识为因子。 ?vector指定:

  

因素不是载体

is.atomicis.vector之间可能会产生混淆,后者会将TRUE返回给没有名称以外属性的对象。

 attributes(test)
$levels
[1] "aa" "bb" "cc"

$class
[1] "factor"

 is.atomic(test)
[1] TRUE
 length(test)
[1] 1
is.vector(test)
[1] FALSE

问题可能会被退回,因为如果你看到:

 sapply(df, class)
        n         s         b 
"numeric"  "factor" "logical" 

为什么R应该转换你子集的对象的类?使用test <- df[1,"s"]您将一个因子分类,这就是R给你的东西。也许有时候改变这种行为可能会更好......也许,但想象一下,如果需要创建用于更改class属性的子集的规则。我认为这是一项艰巨的任务。

答案 3 :(得分:0)

实际上,我认为我找到了我正在寻找的答案,这实际上是为什么 R数据帧中的字符子集存储为因子,而不是存储为矢量的单个元素。意思是它背后的目的,而不仅仅是事实 - 它可以很容易地在?data.frame()中看到。

经过一些研究后发现,这样做的目的实际上是为了在统计分析中以错误的方式应用名义(分类,非序数)数据(例如,它没有做到)感知更多的名义价值 - 改变颜色不是更多的东西,只是名义上不同。

这个网站确实帮我清除了它:http://www.stat.berkeley.edu/~s133/factors.html

感谢您的回复!