【问题标题】:Why is a factor being returned when I subset a dataframe?当我对数据框进行子集化时,为什么会返回一个因子?
【发布时间】:2015-07-11 20:14:14
【问题描述】:

我对 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

谢谢!

【问题讨论】:

    标签: r dataframe factors


    【解决方案1】:

    data.frame() 函数默认将字符向量转换为因子。如果您不希望这种行为,请使用data.frame(..., stringsAsFactors=FALSE)

    还要注意,R 没有“单一值”,它只有向量。甚至数字1 也只是一个长度为一的数值向量。

    【讨论】:

    • 是的,这就是我写的原因,“......而不是一个只有一个元素的向量”
    【解决方案2】:

    ?data.framedata.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.
    

    【讨论】:

      【解决方案3】:

      事实上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 &lt;- df[1,"s"],您将一个因素子集化,这就是 R 回馈给您的东西。也许有时改变这种行为可能会更好......也许,但想象一下,如果是这种情况,有必要创建更改class 属性的子集规则。我认为这是一项艰巨的任务。

      【讨论】:

        【解决方案4】:

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

        经过一些研究,事实证明,这样做的目的实际上是为了防止在统计分析中以错误的方式应用名义(分类、非序数)数据(例如,有 more 的标称值 - 改变颜色不是 more 的东西,只是名义上的不同。

        这个网站真的帮我搞清楚了:http://www.stat.berkeley.edu/~s133/factors.html

        感谢您的回复!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-09
          • 1970-01-01
          相关资源
          最近更新 更多