根据R中的因子生成方程

时间:2014-08-18 05:04:08

标签: r

我是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 :(得分: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

答案 1 :(得分:0)

如果您仍然坚持使用因子列,则可以使用diff添加新的within()列,并使用某种类型强制

> 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

答案 2 :(得分: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