2015-05-18 3 views
4

Возьмите следующие общие данныес использованием интервалов для назначения категориальных значений

A <- c(5,7,11,10,23,30,24,6) 
B <- c(1,2,3,1,2,3,1,2) 
C <- data.frame(A,B) 

и следующих интервалы

library(intervals) 
interval1 <- Intervals(
    matrix(
    c(
     5, 15, 
     15, 25, 
     25, 35, 
     35, 100 
    ), 
    ncol = 2, byrow = TRUE 
), 
    closed = c(TRUE, FALSE), 
    type = "Z" 
) 
rownames(interval1) <- c("A","B","C", "D") 

interval2 <- Intervals(
    matrix(
    c(
     0, 10, 
     12, 20, 
     22, 30, 
     30, 100 
    ), 
    ncol = 2, byrow = TRUE 
), 
    closed = c(TRUE, FALSE), 
    type = "Z" 
) 
rownames(interval2) <- c("P","Q","R", "S") 

Теперь я хочу, чтобы создать следующую таблицу вывода

enter image description here

Поэтому, когда значение A перекрывает два инверсных значения, я хочу «скопировать» все данные a до строки ниже. Мы также вводим data$X, который является значением interval1 и data$y, что является значением interval2. Если данные не помещаются в любой из интервала, я хочу, чтобы удалить его из data.frame

Я не уверен, что если функция break() будет лучше использовать для создания интервалов или если функция dplyr может быть использована чтобы сделать reoccuring строки данных

+0

Я не понимаю. Извините, но ваши объяснения недостаточно ясны. Можете ли вы рассказать о том, как вы получаете 4 первых строки вашего окончательного 'data.frame'? –

+0

Надеюсь, что это прояснит .... значение 5 появляется в интервале 1 как «A», а интервал2 «P» ... значение 7 появляется в интервале 1 как «A» и интервал2 «P». .. значение 11 появляется в интервале 1 как «A», но не в пределах любого интервала2 границ – lukeg

+0

thks! вы хотите использовать пакет с абсолютно интервалом? –

ответ

5

Вы можете использовать foverlaps в data.table:

library(data.table) 
C.DT <- data.table(C) 
C.DT[, A1:=A] # required for `foverlaps` so we can do a range search 

# `D` and `E` are your interval matrices 

I1 <- data.table(cbind(data.frame(D), idX=LETTERS[1:4], idY=NA)) 
I2 <- data.table(cbind(data.frame(E), idX=NA, idY=LETTERS[16:19])) 

setkey(I1, X1, X2) # set the keys on our interval ranges 
setkey(I2, X1, X2) 

rbind(
    foverlaps(C.DT, I1, by.x=c("A", "A1"), nomatch=0), # match every value in `C.DT$A` to the ranges in `I1` 
    foverlaps(C.DT, I2, by.x=c("A", "A1"), nomatch=0) 
)[order(A, B), .(A, B, X=idX, Y=idY)] 

Производит:

 A B X Y 
1: 5 1 A NA 
2: 5 1 NA P 
3: 6 2 A NA 
4: 6 2 NA P 
5: 7 2 A NA 
6: 7 2 NA P 
7: 10 1 A NA 
8: 10 1 NA P 
9: 11 3 A NA 
10: 23 2 B NA 
11: 23 2 NA R 
12: 24 1 B NA 
13: 24 1 NA R 
14: 30 3 C NA 
15: 30 3 NA R 
16: 30 3 NA S 

Обратите внимание, что вы можете легко изменить то, что получаете вместо NA, путем изменения шагов, в которых создаются I1 и I2.

+0

Спасибо, что отлично работает, можете ли вы объяснить функцию setkey() – lukeg

+1

@lukeg Это функция 'data.table', которая упорядочивает вашу таблицу по выбранным столбцам, что позволяет 'data.table' для поиска по этим столбцам, зная, что они упорядочены (это позволяет быстро выполнять поиск). – BrodieG

+1

@lukeg, вы должны опубликовать новый вопрос, который учитывает дополнительную сложность при попытке максимально упростить задачу. – BrodieG

Смежные вопросы