如何创建与列交叉的指标向量?

时间:2019-07-11 03:25:50

标签: r dataframe

我有一列包含以下元素的列:1,2,3,4如何使4个向量i = 1,2,3,4如果该行是i,则为1,如果不是i,则为-1。

示例

mode
 1  
 3
 1
 2
 4
 1


   i1     i2     i3      i4     
   1     -1      -1      -1
  -1     -1       1      -1
   1     -1      -1      -1
  -1      1      -1      -1
  -1     -1      -1       1
   1     -1      -1      -1

我希望很清楚,例如第一行是1,所以i1是1,其他的是-1,第二行是3,所以i3 = 1,其他的是-1,依此类推

2 个答案:

答案 0 :(得分:4)

代替4个向量,这将生成一个矩阵。

vec_mode <- c(1,3,1,2,4,1)

matr <- matrix(-1, nrow = length(vec_mode), ncol = max(vec_mode))
matr[cbind(seq_along(vec_mode), vec_mode)]<- 1

colnames(matr) <- paste0('i', seq_len(max(vec_mode)))

matr

     i1 i2 i3 i4
[1,]  1 -1 -1 -1
[2,] -1 -1  1 -1
[3,]  1 -1 -1 -1
[4,] -1  1 -1 -1
[5,] -1 -1 -1  1
[6,]  1 -1 -1 -1

答案 1 :(得分:1)

使用dplyrtidyr的一种方法是使用row_number和值(val)1创建新列。spread使用{ {1}}来填补缺失的值。

fill = -1

数据

library(dplyr)
library(tidyr)

df %>%
   mutate(row = row_number(), 
          val = 1,
          mode = paste0("i", mode)) %>%
   spread(mode, val, fill = -1) %>%
   select(-row)

#  i1 i2 i3 i4
#1  1 -1 -1 -1
#2 -1 -1  1 -1
#3  1 -1 -1 -1
#4 -1  1 -1 -1
#5 -1 -1 -1  1
#6  1 -1 -1 -1