列如何决定成为数据框中的 class 因素?

how is a column decided to be of class factor in a data frame?

在创建内容包含重复值的列时,我注意到以下有关因子的内容。

1.If 具有重复字符值的列在创建数据框时成为数据框的一部分,它具有 class 因素,但如果稍后追加同一列,它是 class 字符,尽管两种情况下的值相同。这是为什么?

#creating a data frame
name = c('waugh','waugh','smith')
age = c(21,21,27)
df = data.frame(name,age)

#adding a new column which has the same values as the 'name' column above, to the data frame
df$newcol = c('waugh','waugh','smith')

#you can see that the class'es of the two are different though the values are same
class(df$name)
## [1] "factor"
class(df$newcol)
## [1] "character"
  1. 只有包含重复字母内容的列成为一个因素;如果一列包含重复的数值,则不会将其视为一个因素。这是为什么?我很可能是说 1-Male,0-Female,在这种情况下,它应该是一个因素?

    请注意,这两列都包含重复值

    class(df$name)
    ## [1] "factor"
    class(df$age)
    ## [1] "numeric"
    

这基本上在评论中得到了回答,但我会把答案放在这里以结束这个问题。

当您使用 data.frame() 创建一个 data.frame 时,该函数实际上会操作您传入的参数以创建 data.frame 对象。具体来说,默认情况下,它有一个名为 stringsAsFactors=TRUE 的参数,因此它将获取您传入的所有字符向量并将它们转换为因子向量,因为通常您在各种统计测试中将这些值视为分类随机变量,并且它可以是如果您有许多值在向量中重复,则将字符值存储为一个因素会更有效。

df <- data.frame(name,age)
class(df$name)
# [1] "factor"
df <- data.frame(name,age, stringsAsFactors=FALSE)
class(df$name)
# [1] "character"

请注意,data.frame 本身不记得在其构造过程中使用的 "stringsAsFactors" 值。这仅在您实际 运行 data.frame() 时使用。因此,如果您通过 $<- 语法或 cbind() 分配它们来添加列,则不会发生强制转换

df1 <- data.frame(name,age)
df2 <- data.frame(name,age, stringsAsFactors=FALSE)
df1$name2 <- name
df2$name2 <- name
df3 <- cbind(data.frame(name,age), name2=name)
class(df1$name2)
# [1] "character"
class(df2$name2)
# [1] "character"
class(df3$name2) 
# [1] "character"

如果要将列添加为因子,则需要自己转换为因子

df = data.frame(name,age)
df$name2 <- factor(name)
class(df$name2)
# [1] "factor"