如何根据R中的两个分类变量创建一个新变量?

时间:2014-06-29 04:20:02

标签: r variables

我有两个分类变量a&湾

a = sample(0:1, size=10, replace=T )
b = sample(0:1, size=10, replace=T )

我想创建一个新变量c,其值取决于& b以这种方式:

c = vector(length=10)
c[a==1 & b==1] = 1
c[a==1 & b==0] = 2
c[a==0 & b==1] = 3
c[a==0 & b==0] = 4

是否可以从基本软件包中执行一个简单的功能?

我需要处理基于多个变量创建新变量,每个变量都有多个类别。所以我正在寻找一种有效的解决方案,而不是我刚才使用的解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:1)

interaction根据适当的输入做你想做的事情:

> a
 [1] 1 1 1 1 1 1 0 0 0 0
> b
 [1] 0 1 0 0 0 1 0 0 0 0

as.numeric(interaction(!b, !a))
## [1] 2 1 2 2 2 1 4 4 4 4

等效地:

as.numeric(interaction(!a, !b, lex.order=TRUE))

甚至:

as.numeric(as.factor(!a):as.factor(!b))

!是强制输入以获得您在问题中获得的确切结果(您希望输入1值出现在输入0值之前,即反向默认因子排序)。

但是,interaction用于创建因子互动,并且可以处理任何因素(如果输入已经是因素,: interaction会将其输入强制转换为{{1} }})。

factor并不意味着排序,这意味着更快地增加尾随因子(在这种情况下,此设置意味着lex.order=TRUE的每个值都会循环显示!b的每个值)。

答案 1 :(得分:0)

以下是另外两个选项:

set.seed(1)
a = sample(0:1, size=10, replace=T )
b = sample(0:1, size=10, replace=T )

#Option 1
c = ifelse(a == 1 & b == 1, 1, 
       ifelse(a == 1 & b == 0, 2, 
              ifelse(a == 0 & b == 1, 3,4)
              )
       )
#Option 2
c2 = (a == 1 & b == 1) * 1 +
  (a == 1 & b == 0) * 2 +
  (a == 0 & b == 1) * 3 +
  (a == 0 & b == 0) * 4

给你:

> cbind(a,b,c,c2)
      a b c c2
 [1,] 1 1 1  1
 [2,] 1 0 2  2
 [3,] 1 1 1  1
 [4,] 0 1 3  3
 [5,] 0 0 4  4
 [6,] 1 1 1  1
 [7,] 0 0 4  4
 [8,] 1 0 2  2
 [9,] 0 1 3  3
[10,] 1 0 2  2