我有一列包含以下元素的列: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,依此类推
答案 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)
使用dplyr
和tidyr
的一种方法是使用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