如何在R中以100个级别重新考虑R中的因子?

时间:2017-04-06 17:39:32

标签: r

我有一个因子变量有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"......))

1 个答案:

答案 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