【问题标题】:Why gsub automatically changes a Factor into Character为什么 gsub 会自动将 Factor 更改为 Character
【发布时间】:2020-01-29 11:58:04
【问题描述】:

在加载数据时,R 将字符串转换为因子,除非另有说明。然后,我们必须根据基础数据将因子转换为字符或数字。在数值的情况下,我们首先使用 as.character() 转换为字符串,然后在整数值的情况下将结果转换为 as.integer()。

但是在使用 gsub 从数字中清理字符时,R 会自动将清理后的字符串转换为字符。

例如:

> sal <- data.frame(name = c('abc','def','ghi','pqr'),
+                   Salary = c('$65,000','$102,000','$85,000','$72,000'))
> str(sal)
'data.frame':   4 obs. of  2 variables:
 $ name  : Factor w/ 4 levels "abc","def","ghi",..: 1 2 3 4
 $ Salary: Factor w/ 4 levels "$102,000","$65,000",..: 2 1 4 3
> sal$Salary <- gsub('\\$','',sal$Salary)
> sal$Salary <- gsub(',','',sal$Salary)
> str(sal)
'data.frame':   4 obs. of  2 variables:
 $ name  : Factor w/ 4 levels "abc","def","ghi",..: 1 2 3 4
 $ Salary: chr  "65000" "102000" "85000" "72000"
> 

我们可以看到在 gsub 之后“Salary”列从 Factor 变为 Character。有人可以让我知道 gsub 是否也在这里执行 as.character() 操作?如果是这样,它不会将列转换为整数,因为所有值都是整数吗?

【问题讨论】:

    标签: r gsub


    【解决方案1】:

    是的,gsub 执行 as.character。如果你在控制台输入gsub就可以看到函数

    function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE, 
    fixed = FALSE, useBytes = FALSE) 
    {
        if (!is.character(x)) 
            x <- as.character(x)
        .Internal(gsub(as.character(pattern), as.character(replacement), 
             x, ignore.case, perl, fixed, useBytes))
    }
    

    不,它不会直接转换为整数,因为它总是返回一个字符向量。来自?gsub

    sub 和 gsub 返回一个与 x 具有相同长度和相同属性的字符向量(在可能强制转换为字符之后)。

    【讨论】:

      【解决方案2】:

      您可以直接更改作为字符的因子的级别:

      sal <- data.frame(name = c('abc','def','ghi','pqr'),
                    Salary = c('$65,000','$102,000','$85,000','$72,000'))
      
      
      levels(sal$Salary) <- gsub('\\$|,', '', levels(sal$Salary))
      str(sal)
      
      
      > 'data.frame': 4 obs. of  2 variables:
       $ name  : Factor w/ 4 levels "abc","def","ghi",..: 1 2 3 4
       $ Salary: Factor w/ 4 levels "102000","65000",..: 2 1 4 3
      

      【讨论】:

        【解决方案3】:

        您似乎在问一个“为什么”的问题。在这种情况下,答案无疑是由于结果需要是字符而不是因子,因为因子的水平是属性而不是实际值。因子变量的值不是您在 str 输出中看到的值,而是从 1 开始的 inters。第一项:“65000”的值为 2,但将显示为 65000。

        所以你的值是一个整数是正确的,但不是你认为的值。第二个项目的值为 1,因为它的属性级别将具有最低的词汇顺序,尽管一旦转换为数字,它最终会成为最高的数值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          • 2021-08-15
          • 2014-12-16
          • 2016-05-23
          • 2017-06-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多