在R中转置并创建分类值

时间:2016-03-22 15:59:25

标签: r

我有一个具有以下结构的数据框,我希望将变量转换为分类。意图是找到变量的加权组合。

       data <- read.table(header=T, text='
              subject weight sex  test 
              1       2      M     control 
              2       3      F     cond1  
              3       2      F     cond2  
              4       4      M    control
              5       3      F    control
              6       2      F    control
               ')

      data

预期产出:

          subject weight control_F control_M cond1_F cond1_M cond2_F cond2_M
           1       2        0        1          0      0      0        0
           2       3        0        0          1      0      0        0
           3       2        0        0          0      0      1        0
           4       4        0        1          0      0      0        0
           5       3        1        0          0      0      0        0
           6       2        1        0          0      0      0        0

我尝试使用ifelse和cut的组合,但只是无法产生输出。

关于我如何做到这一点的任何想法?

TIA

2 个答案:

答案 0 :(得分:3)

您可以使用

model.matrix(~ subject + weight + sex:test - 1, data)

答案 1 :(得分:2)

我认为model.matrix在这里最自然(请参阅@Julius的回答),但这里有另一种选择:

library(data.table)
setDT(data)

dcast(data, subject+weight~test+sex, fun=length, drop=c(TRUE,FALSE))


   subject weight cond1_F cond1_M cond2_F cond2_M control_F control_M
1:       1      2       0       0       0       0         0         1
2:       2      3       1       0       0       0         0         0
3:       3      2       0       0       1       0         0         0
4:       4      4       0       0       0       0         0         1
5:       5      3       0       0       0       0         1         0
6:       6      2       0       0       0       0         1         0

要以“正确”顺序获取列(首先使用控件),请在投射前设置因子级别:

data[, test := relevel(test, "control")]
dcast(data, subject+weight~test+sex, fun=length, drop=c(TRUE,FALSE))


   subject weight control_F control_M cond1_F cond1_M cond2_F cond2_M
1:       1      2         0         1       0       0       0       0
2:       2      3         0         0       1       0       0       0
3:       3      2         0         0       0       0       1       0
4:       4      4         0         1       0       0       0       0
5:       5      3         1         0       0       0       0       0
6:       6      2         1         0       0       0       0       0

(注意:reshape2的dcast在这里不太好,因为它的drop选项适用于行和列。)