0

我有一个包含变量sexnavigation. 该sex变量具有malefemale作为值。“导航”变量具有menutags作为值。

我想创建一个具有值male_menu,male_tagsfemale_menu&的新变量,female_tags因为它们是两个现有变量的可能组合。

如何在原始数据集中创建这样一个新变量R并将其包含在原始数据集中?

4

3 回答 3

4

我理解你想要的东西与@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

那是你想要的吗?

于 2013-03-22T17:15:00.173 回答
2

听起来您正在为模型创建虚拟变量。这是一个简单的方法,使用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中的功能。

于 2013-03-22T17:11:37.103 回答
2

只是另一种选择,您也可以使用paste.

your_data$sex_navigation <- with(your_data, paste(sex, navigation, sep = "_"))

当然,您可以通过将其包装在factor(). interaction这与方法之间的主要区别在于,interaction它将创建一个因素,其中级别包括所有可能的交互,无论它们是否存在。该factor(paste())方法将仅包括存在的级别。我发现这interaction通常更可取,但时不时地paste是我想要的。

于 2013-03-22T17:50:40.993 回答