【问题标题】:how is a column decided to be of class factor in a data frame?如何将一列确定为数据框中的类因素?
【发布时间】:2015-03-07 00:41:42
【问题描述】:

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

1.如果在创建数据框时将具有重复字符值的列作为数据框的一部分,则属于类因素,但如果稍后附加相同的列,则尽管值是类字符在这两种情况下都是一样的。这是为什么呢?

#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.framestringsAsFactors 参数。 $<-.data.frame 不调用 data.frame 构造函数,因此不会发生任何转换。
  • 对 Joshua 的评论唯一要补充的是,导致创建因子列的不是重复值,而是 data.frame 如何处理 any 字符向量. (没有“决定”。)
  • @JoshuaUlrich 谢谢,我在创建 df 时尝试了 stringsAsFactors=FALSE。不过,我有一个问题,当我添加一个新列时,如何将其设置为 TRUE,例如 df$newcol = c('waugh','waugh','smith')

标签: r


【解决方案1】:

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

当您使用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() 时使用。因此,如果您通过$&lt;- 语法或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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2014-02-03
    • 1970-01-01
    • 2014-12-11
    • 2017-07-05
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多