我有以下数据
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/