2017-04-06 47 views
2

我有一個因子變量,有0和1的100個級別。例如:00000001,01000000,11000000,00010001.每個級別都有8個數字,分別爲0和1。我想要做的是以1的總和從最小到最大的方式重新排列級別。例如,我希望10000000,01000000,00100000和其他級別只包含一個1.隨後級別包含兩個1,最多包含八個1。那是我可以自動做的,而不是手動做到的任何方式?如何在R中100個級別再現R的一個因子?

df[,1] <- factor(df[,1], levels=c("000", "001","100", "010","101","110","011","111"......)) 

回答

1

虛擬數據

d <- c("00010001", "00000001", "01000000", "11000000") 

您可以使用gregexpr計算有多少1S是你的性格vecotr的每個條目。

num_ones <- lengths(gregexpr("1", d)) 
> num_ones 
[1] 2 1 1 2 

然後,您可以拆分您的矢量,按照數量進行分組。在每個組中,您可以選擇減少或增加。最後,取消所有返回已排序向量的內容。

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 
+0

Zalazny7您好,感謝您的回覆。它對值進行了處理和排序。唯一的是我不想排序值,我只想排序的水平。無論如何,我可以做到這一點? –

+0

我做了d < - 因子(d,levels = sorted),但是我有100個數據點。所以一些數據點具有相同的級別(值)。當我運行它時,它給了我:警告信息: 在'levels <-'('* tmp *',value = if(nl == nL)as.character(labels)else paste0(labels,: duplicate levels在因素中已棄用 –

+0

請確保您正在執行該正則表達式並在您的因子水平上進行分割。不是值 – Zelazny7