我有一个因子变量有100个级别,0和1。例如:00000001,010000100,11000000,10000001。每个级别有8位数字,0和1。我想要做的是以1s的总和从最小到最大的方式重新排序水平。例如,我想要10000000,1000000,00100000和其他只包含一个1的级别。后续级别包含两个1,最多级别包含8个1。这是我可以自动执行的任何方式,而不是手动执行此操作吗?
df[,1] <- factor(df[,1], levels=c("000", "001","100", "010","101","110","011","111"......))
答案 0 :(得分:1)
虚拟数据
d <- c("00010001", "00000001", "01000000", "11000000")
您可以使用gregexpr
来计算角色vecotr每个条目中的1个。
num_ones <- lengths(gregexpr("1", d))
> num_ones
[1] 2 1 1 2
然后,您可以拆分矢量,将其按1的数量分组。在每个组中,您可以选择减少或增加排序。最后,取消列出返回已排序向量的所有内容。
unlist(lapply(split(d, num_ones), sort))
> unlist(lapply(split(d, num_ones), sort))
11 12 21 22
"00000001" "01000000" "00010001" "11000000"
您可以将此方法应用于因子的级别,如下所示重新排序:
d <- factor(c("00010001", "00000001", "01000000", "11000000"))
lvls <- levels(d)
num_ones <- lengths(gregexpr("1", lvls))
sorted <- unlist(lapply(split(lvls, num_ones), sort))
d <- factor(d, levels = sorted)
> d
[1] 00010001 00000001 01000000 11000000
Levels: 00000001 01000000 00010001 11000000