我是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更改值。是否有另一种方法可以使上述方程起作用?谢谢!
答案 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