我有一个包含变量sex
和navigation
. 该sex
变量具有male
和female
作为值。“导航”变量具有menu
和tags
作为值。
我想创建一个具有值male_menu
,male_tags
和female_menu
&的新变量,female_tags
因为它们是两个现有变量的可能组合。
如何在原始数据集中创建这样一个新变量R
并将其包含在原始数据集中?
我有一个包含变量sex
和navigation
. 该sex
变量具有male
和female
作为值。“导航”变量具有menu
和tags
作为值。
我想创建一个具有值male_menu
,male_tags
和female_menu
&的新变量,female_tags
因为它们是两个现有变量的可能组合。
如何在原始数据集中创建这样一个新变量R
并将其包含在原始数据集中?
我理解你想要的东西与@zach 有所不同。在这里,我使用该interaction
函数创建一个具有您指定的四个级别的新因子。这里使用一些虚拟数据
set.seed(42)
sex <- sample(c("Male","Female"), 20, replace = TRUE)
navigation <- sample(c("menu","tags"), 20, replace = TRUE)
interaction(sex, navigation)
最后一行给出
> interaction(sex, navigation)
[1] Female.tags Female.menu Male.tags Female.tags Female.menu Female.tags
[7] Female.menu Male.tags Female.menu Female.tags Male.tags Female.tags
[13] Female.menu Male.tags Male.menu Female.tags Female.menu Male.menu
[19] Male.tags Female.tags
Levels: Female.menu Male.menu Female.tags Male.tags
那是你想要的吗?
听起来您正在为模型创建虚拟变量。这是一个简单的方法,使用model.matrix
:
dat <- iris
dat$navigation <- sample(c('menu', 'tags'), nrow(dat), replace=TRUE)
newdat <- data.frame(model.matrix(~0+.+Species*navigation, dat))
> head(newdat)
Sepal.Length Sepal.Width Petal.Length Petal.Width Speciessetosa
1 5.1 3.5 1.4 0.2 1
2 4.9 3.0 1.4 0.2 1
3 4.7 3.2 1.3 0.2 1
4 4.6 3.1 1.5 0.2 1
5 5.0 3.6 1.4 0.2 1
6 5.4 3.9 1.7 0.4 1
Speciesversicolor Speciesvirginica navigationtags
1 0 0 0
2 0 0 1
3 0 0 0
4 0 0 0
5 0 0 1
6 0 0 0
Speciesversicolor:navigationtags Speciesvirginica:navigationtags
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 0 0
如果由于某种原因您不想降低参考水平,则可以使用caretdummyVars
中的功能。
只是另一种选择,您也可以使用paste
.
your_data$sex_navigation <- with(your_data, paste(sex, navigation, sep = "_"))
当然,您可以通过将其包装在factor()
. interaction
这与方法之间的主要区别在于,interaction
它将创建一个因素,其中级别包括所有可能的交互,无论它们是否存在。该factor(paste())
方法将仅包括存在的级别。我发现这interaction
通常更可取,但时不时地paste
是我想要的。