我有以下数据

ID v1 v2 v3 v4 v5
1  1  3  6  4
2  4  2
3  3  1   8    5
4  2  5   3    1

我可以重新排列数据,使其自动创建新列并根据每个变量(v1 到 v5)中的值分配二进制值(1 或 0)吗?

例如。在第一行,我有 1、3、4 和 6 的值。 R 可以自动创建 6 个虚拟变量来将值分配给相应的列,如下所示:
 ID dummy1 dummy2 dummy3 dummy4 dummy5 dummy6
 1    1     0      1      1      0       1

有这样的事情:
ID c1 c2 c3 c4 c5 c6 c7 c8
1  1  0  1  1  0  1  0  0
2  0  1  0  1  0  0  0  0
3  1  0  1  0  1  0  0  1
4  1  1  1  0  1  0  0  0

谢谢。

最佳答案

我们可以使用 base R 来做到这一点。循环遍历数据集除第一列之外的行,获取行中 max 值的序列,检查其中有多少行并使用 integer 将其转换为 as.integer ,在末尾附加 NA 使长度相同在 list 输出和 cbind 与第一列

lst <- apply(df[-1], 1, function(x) as.integer(seq_len(max(x, na.rm = TRUE)) %in% x))
res <- cbind(df[1], do.call(rbind, lapply(lst, `length<-`, max(lengths(lst)))))
res[is.na(res)] <- 0
colnames(res)[-1] <- paste0('c', 1:8)
res
#  ID c1 c2 c3 c4 c5 c6 c7 c8
#1  1  1  0  1  1  0  1  0  0
#2  2  0  1  0  1  0  0  0  0
#3  3  1  0  1  0  1  0  0  1
#4  4  1  1  1  0  1  0  0  0

关于重新排列和排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49071348/

10-12 22:16