我有两个分类变量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
是否可以从基本软件包中执行一个简单的功能?
我需要处理基于多个变量创建新变量,每个变量都有多个类别。所以我正在寻找一种有效的解决方案,而不是我刚才使用的解决方案。
提前致谢。
答案 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