如何使用R计算由两个变量定义的新变量?

时间:2013-03-22 17:05:20

标签: r merge interaction

我有一个包含变量sexnavigation的数据集。 sex变量的值为malefemale。 “导航”变量的值为menutags

我想创建一个值为male_menumale_tagsfemale_menu&的新变量female_tags因为这些是两个现有变量的可能组合。

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

3 个答案:

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

这就是你想要的吗?

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

如果由于某种原因您不想删除参考级别,可以使用caret中的dummyVars功能。

答案 2 :(得分:2)

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

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

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