我正在使用ISLR数据包中的OJ
数据集。我需要添加到数据框的列。一栏是两个数值变量的乘积。第二列是数字变量和分类变量的乘积。
我在R中的mutate
包中使用dplyr
函数添加了第一列(数字*数字),
require(ISLR)
OJ %>%
mutate(`StoreID:PriceCH` = StoreID*PriceCH)
并且我能够成功添加此同伴。但是当我尝试在添加类别*数字列时尝试执行相同操作时,出现了错误。
OJ %>%
mutate(`Store7:PriceCH` = Store7*PriceCH)
Warning message:
In Ops.factor(Store7, PriceCH) : ‘*’ not meaningful for factors
如果我需要添加绝对值*数值的乘积,谁能建议我该怎么办?
我的输出应该是这样的,
谢谢
答案 0 :(得分:0)
首先对Store7
应用单热编码:
OJ <- cbind(OJ, sapply("Yes", function(x) as.integer(x == OJ$Store7)))
names(OJ)[ncol(OJ)] <- "Store7_Yes"
答案 1 :(得分:0)
从概念上讲,在大多数情况下,乘以分类变量并没有多大意义。
如果要这样做,必须将数据转换为数字刻度。请注意,这并不总是那么直接。
这可能是一个起点:
library(tidyverse)
Result <- OJ %>%
mutate(`StoreID:PriceCH` = StoreID*PriceCH) %>%
mutate(Store7Numeric = as.character(Store7)) #To avoid possible mistakes
Result <- Result %>%
mutate(Store7Numeric = ifelse(Store7Numeric == "No", 0, 1)) #Check this
Result <- Result %>% mutate(Store7Numeric = as.numeric(Store7Numeric)) %>% #To numeric
mutate(`Store7:PriceCH` = Store7Numeric*PriceCH) %>% #Your calculation
select(-Store7Numeric) #Remove, if you want. the created numeric variable
答案 2 :(得分:0)
错误消息是由于变量Store7
为factor
(请参见str(OJ)
),因此必须使其为numeric
:
OJ$Store7 <- as.numeric(OJ$Store7)