首页 文章

从R中的因子生成方程[重复]

提问于
浏览
3

这个问题在这里已有答案:

我是R的新手,我正在尝试创建一个新列,它是一列减去另一列 . 例如:

price <- c("$10.00", "$7.15", "$8.75", "12.00", "9.20")
quantity <- c(5, 6, 7, 8, 9)
price <- as.factor(price)
quantity <- as.factor(quantity)
df <- data.frame(price, quantity)

在我的实际数据集中,所有列都作为因子导入 . 当我尝试创建新列时,我得到了这个:

diff <- price - quantity
In Ops.factor(price, quantity): - not meaningful for factors

我试图使用as.numeric(df),as.numeric(levels(df)),as.numeric(levels(df))[df]将数据强制转换为数字,并将stringsAsFactors设置为false,但数据得到转换为NA . Data.matrix更改值 . 是否有另一种方法可以使上述方程起作用?谢谢!

3 回答

  • 0

    您应该避免使用“”和$ in price列,如果您想对它们进行数学运算,请避免将它们转换为因子:

    price <- c(10.00, 7.15, 8.75, 12.00, 9.20)
    quantity <- c(5, 6, 7, 8, 9)
    df <- data.frame(price, quantity)
    
    df$diff <- price - quantity
    
    df
      price quantity diff
    1 10.00        5 5.00
    2  7.15        6 1.15
    3  8.75        7 1.75
    4 12.00        8 4.00
    5  9.20        9 0.20
    
  • 0

    尝试:

    as.numeric(gsub("^\\$","", price))-as.numeric(as.character(quantity))
     #[1] 5.00 1.15 1.75 4.00 0.20
    

    或者来自 df

    df$diff <- Reduce(`-`,lapply(df, function(x) as.numeric(gsub("^\\$","",x))))
     df$diff
     #[1] 5.00 1.15 1.75 4.00 0.20
    
  • 0

    如果你坚持使用因子列,你可以添加一个带 within() 的新 diff 列和一些类型强制

    > within(df, {
          diff <- as.numeric(gsub("[$]", "", price)) - 
                      as.numeric(as.character(quantity))
      })
    #    price quantity diff
    # 1 $10.00        5 5.00
    # 2  $7.15        6 1.15
    # 3  $8.75        7 1.75
    # 4  12.00        8 4.00
    # 5   9.20        9 0.20
    

    您也可以考虑返回并将数据重新读入R.这很简单,并且会使事情变得容易一些 . 这是你如何做到这一点并以这种方式获得所需的结果 .

    创建数据文件:这对您来说不是必需的,因为您可以再次读取原始文件 .

    > write.table(df, "df.txt")
    

    将数据读入R,删除 $ 符号,并计算差异:

    > df2 <- read.table("df.txt", stringsAsFactors = FALSE)
    > df2$price <- as.numeric(gsub("[$]", "", df2$price))
    > with(df2, { price - quantity })
    # [1] 5.00 1.15 1.75 4.00 0.20
    

相关问题