从4个虚拟对象创建因子/分类变量

时间:2014-10-10 17:15:01

标签: r r-factor

我有一个包含四列的数据框,让他们称之为V1-V4和十个观察。 V1-V4中的每一行每行为1,其他V1-V4为0.我想创建一个名为NEWCOL的新列,如果V3为1,则取值为3,如果V4为1则取值为4,否则为0。

我必须为多组变量V1-V4执行此操作,因此我希望解决方案尽可能短,以便于复制。

2 个答案:

答案 0 :(得分:1)

这是4列使用矩阵乘法添加第五个:

> cbind( mydf, newcol=data.matrix(mydf) %*% c(0,0,3,4) )
   V1 V2 V3 V4 newcol
1   1  0  0  0      0
2   1  0  0  0      0
3   0  1  0  0      0
4   0  1  0  0      0
5   0  0  1  0      3
6   0  0  1  0      3
7   0  0  0  1      4
8   0  0  0  1      4
9   0  0  0  1      4
10  0  0  0  1      4

可以获得多列......我们只需要规则。您需要使用与原始数据中的列相同的行数来创建matric,并为构建每个新变量所需的每个新因子分配一列。这显示了如何从第三列的3倍加上第四列的4倍的总和构建一个新列,以及从第一列的一倍和第二列的两倍的另一个新列。

> cbind( mydf, newcol=data.matrix(mydf) %*% matrix(c(0,0,3,4,  # first set of factors
                                                     1,2,0,0), # second set
                                                   ncol=2) )
   V1 V2 V3 V4 newcol.1 newcol.2
1   1  0  0  0        0        1
2   1  0  0  0        0        1
3   0  1  0  0        0        2
4   0  1  0  0        0        2
5   0  0  1  0        3        0
6   0  0  1  0        3        0
7   0  0  0  1        4        0
8   0  0  0  1        4        0
9   0  0  0  1        4        0
10  0  0  0  1        4        0

答案 1 :(得分:0)

示例数据集:

mydf <- data.frame(V1 = c(1, 1, rep(0, 8)),
                   V2 = c(0, 0, 1, 1, rep(0, 6)),
                   V3 = c(rep(0, 4), 1, 1, rep(0, 4)),
                   V4 = c(rep(0, 6), rep(1, 4)))   
#    V1 V2 V3 V4
# 1   1  0  0  0
# 2   1  0  0  0
# 3   0  1  0  0
# 4   0  1  0  0
# 5   0  0  1  0
# 6   0  0  1  0
# 7   0  0  0  1
# 8   0  0  0  1
# 9   0  0  0  1
# 10  0  0  0  1

这是生成新列的简便方法:

mydf <- transform(mydf, NEWCOL = V3 * 3 + V4 * 4)
#    V1 V2 V3 V4 NEWCOL
# 1   1  0  0  0      0
# 2   1  0  0  0      0
# 3   0  1  0  0      0
# 4   0  1  0  0      0
# 5   0  0  1  0      3
# 6   0  0  1  0      3
# 7   0  0  0  1      4
# 8   0  0  0  1      4
# 9   0  0  0  1      4
# 10  0  0  0  1      4