2016-03-02 64 views
2

我的數據是基於另一列如何突出順序串在一列

df <- structure(list(M1 = c(4L, 11L, 11L, 11L, 11L, 11L, 11L, 16L, 
16L, 16L, 16L, 16L, 16L, 16L), M2 = structure(c(14L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L), .Label = c(" B135", 
" B168", " B172", " B299", " B300", " B301", " B335", " B336", 
" B364", " B566", " B567", " B590", " B591", "A"), class = "factor"), 
    N = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), N2 = c(470L, 14L, 12L, 16L, 9L, 14L, 14L, 24L, 15L, 
    32L, 193L, 76L, 10L, 9L)), .Names = c("M1", "M2", "N", "N2" 
), class = "data.frame", row.names = c(NA, -14L)) 

的數據看起來像這樣

>df 
# M1 M2 N N2 
#1 4  A 1 470 
#2 11 B135 1 14 
#3 11 B168 1 12 
#4 11 B172 1 16 
#5 11 B299 1 9 
#6 11 B300 1 14 
#7 11 B301 1 14 
#8 16 B335 1 24 
#9 16 B336 1 15 
#10 16 B364 1 32 
#11 16 B566 1 193 
#12 16 B567 1 76 
#13 16 B590 1 10 
#14 16 B591 1 9 

什麼,我找做,是檢查M1並基於M1突出顯示M2 我想根據M1 的相似值評估順序

# M1 M2 N N2 
#1 4 A 1 470 

所以它是唯一的一個,我不需要強調它

#2 11 B135 1 14 
#3 11 B168 1 12 
#4 11 B172 1 16 
#5 11 B299* 1 9 
#6 11 B300* 1 14 
#7 11 B301* 1 14 

在本節(從M1的所有數據是11),B299,B300和B301是順序(後互相重複)所以我想,例如以突出顯示它在本節的明星

#8 16 B335* 1 24 
#9 16 B336* 1 15 
#10 16 B364 1 32 
#11 16 B566** 1 193 
#12 16 B567** 1 76 
#13 16 B590*** 1 10 
#14 16 B591*** 1 9 

(從M1的所有值是16),B335和B336是連續的,所以我強調他們有一個明星,然後B566和B567也相繼有* *明星,因爲他們不同於第一個,相同的第三個連續組等

+0

在最後一節你'B335 *'和'B336 *'但在你的例子是沒有'B336'。這是一個錯字嗎? –

+0

@PierreLafortune感謝這是一個錯字,我糾正了它 – nik

回答

2

下面是一個嘗試,這個假設值進行排序,如你的例子:

highlight_seq <- function(x){ 
     #get sequences of numbers and get rid of NAs 
     num_seq <- (diff(as.numeric(gsub("\\D", "", x)))==1)*1 
     num_seq[is.na(num_seq)] <- 0 

     #to figure out the number of each sequence, use rle 
     num_seq <- rle(num_seq) 

     #replace 1s by the cumsum 
     num_seq$values[which(num_seq$values!=0)]=cumsum(num_seq$values)[which(num_seq$values!=0)] 
     num_seq <- inverse.rle(num_seq) 

     #since diff was initially used, add the first value of each sequence 
     num_seq <- c(0,num_seq) 
     num_seq[which(num_seq!=0)-1] <- num_seq[which(num_seq!=0)] 

     #paste asterisks in after the sequences 
     return(paste0(x,sapply(num_seq,function(p) paste(rep("*",p),collapse="")))) 
} 

library(dplyr) 
df %>% group_by(M1) %>% mutate(M2=highlight_seq(M2)) 


    M1  M2 N N2 
1 4  A 1 470 
2 11 B135 1 14 
3 11 B168 1 12 
4 11 B172 1 16 
5 11 B299* 1 9 
6 11 B300* 1 14 
7 11 B301* 1 14 
8 16 B335 1 24 
9 16 B363* 1 15 
10 16 B364* 1 32 
11 16 B566** 1 193 
12 16 B567** 1 76 
13 16 B568** 1 10 
14 16 B569** 1 9 
+0

我們可以得到與問題中提到的相同的結構輸出嗎? – nik

+0

這絕對是非常好的,但有一個小問題。它不會刷新每個部分的明星,所以它正在瘋狂地增長。可以說在這個例子中我們有3節4,11和16節,我希望每次重新開始都不會收到太多的明星,你知道我的意思嗎? – nik

+0

我看到了,我編輯過,只是把它變成了一個函數,並且使用'group_by(M1)'將高亮函數應用到每個部分 – NicE