группирующая переменная для упорядоченных элементов с использованием приличной корреляции с использованием R - PullRequest
1 голос
/ 02 февраля 2012

У меня есть переменная «markr», которая упорядочена по порядку, и корреляция между последующими элементами «markr» приведена в переменных corr.

markr <- c("A", "B", "C", "D", "E",  "g", "A1", "B1", "cc", "dd", 
     "f", "gg", "h", "K")
corr <- c(     1,   1,   1,   1, 0.96,   0.5,  0.96,        1 ,   1 ,  
       1 ,  0.85, 0.99, 1)

Мне нужно сгруппировать маркер на основе corr без изменения порядка членов маркера. Группу лучше объяснить следующей схемой:

enter image description here

Отдельные члены abject markr, у которых corr больше 0,95, будут входить в одну группу. Начиная с первого значения, когда значение corr падает ниже 0,95, затем начинается вторая группа и продолжается до тех пор, пока значение corr снова не опустится ниже 0,95, процесс продолжается до конца данных. Групповая переменная именуется первым и последним членами группы, например - A-g, A1-f, gg-k.

Таким образом, ожидаемый результат равен.

markr <- c("A", "B", "C", "D", "E",  "g", 
           "A1", "B1", "cc", "dd", "f", 
           "gg", "h", "K")
group <- c("A-g", "A-g", "A-g", "A-g","A-g", "A-g", 
           "A1-f",  "A1-f",  "A1-f",  "A1-f","A1-f", 
            "gg-k", "gg-k", "gg-k")
dataf <- data.frame (markr, group) 

dataf 

 markr group
1      A   A-g
2      B   A-g
3      C   A-g
4      D   A-g
5      E   A-g
6      g   A-g
7     A1  A1-f
8     B1  A1-f
9     cc  A1-f
10    dd  A1-f
11     f  A1-f
12    gg  gg-k
13     h  gg-k
14     K  gg-k

Как я могу автоматизировать этот процесс, поскольку у меня очень большой такой набор данных.

1 Ответ

1 голос
/ 02 февраля 2012

Номер группы - это число значений до 0,95, которое мы видели до сих пор:

d1 <- data.frame(
  marker = markr,
  group = cumsum(c(1, corr < .95))
)

Для имен групп вы можете использовать ddply разрезать data.frame на частипо одному на группу: тогда легко извлечь первый и последний элемент.

library(plyr)
d2 <- ddply( 
  d1, "group", summarize, 
  group_name=paste(head(marker,1), tail(marker,1), sep="-")
)
d <- merge(d1, d2, by="group")
...