2013-07-12 3 views
0

Позвольте мне уточнить. В принципе, у меня есть кадр данных с 4 столбцами, а в одном из столбцов есть NA. Когда NA происходят, они всегда встречаются в группах. Я зацикливаюсь по этому кадру данных по строкам, глядя на столбец. То, что я хочу сделать, - это как только я найду NA, я хочу подмножить фрейм данных из этой строки в строку с последним вхождением NA, прежде чем я получу нормальное значение.Как подмножить фрейм данных в R на основе следующего вхождения?

Так, например, скажем, мы посмотрим на мой кадр данных ДФ:

C1 C2 C3 C4 C5 C6 
R1 2 1 2 1 0 0 
R2 2 2 1 1 0 0 
R3 0 0 1 1 2 1 
R4 2 2 1 NA 0 0 
R5 0 0 1 NA 2 1 
R6 0 0 1 NA 2 1 
R7 2 2 1 NA 0 0 
R8 0 0 1 1 2 1 
R9 2 1 2 1 0 0 
R10 2 2 1 1 0 0 
R11 0 0 1 1 2 1 
R12 2 2 1 NA 0 0 
R13 0 0 1 NA 2 1 
R14 0 0 1 NA 2 1 

Как я тогда петля через ф.р. по строкам, я прийти через первый NA в строке 4, я тогда хочу Подмножество df из строки 4 в строку 7, где последний NA находится в этой конкретной группе NA.

Подгруппа:

R4 2 2 1 NA 0 0 
R5 0 0 1 NA 2 1 
R6 0 0 1 NA 2 1 
R7 2 2 1 NA 0 0 

Обратите внимание, что я не подмножество всех строк с НС, только текущую «группу» НС я смотрел. Я не подмножался из строк 12-14.

Как это сделать?

+0

Вы хотите, чтобы каждый набор этих строк (с последовательными строками NA) в списке? (если у вас больше строк, где это может произойти более одного раза). – Arun

+0

И это только C4, у которого всегда есть NA? – Arun

+0

@Arun, я хотел бы подмножество в новый фрейм данных, поэтому, рассмотрев вышеприведенный пример, как только я натолкнулся на NA в строке 4, мне бы хотелось найти последний NA на участке NA, а затем подмножество соответственно. Поэтому в основном я бы хотел, чтобы мой подмножество был следующим: subset = df [4: 7,]. Проблема состоит в том, чтобы узнать последнюю строку до конца. – user2560984

ответ

1

Один из способов хранить идентификаторы последовательных NA с в списке, а затем подмножество же вы хотите позже (с помощью lapply или явного for-loops)

isna <- is.na(df$C4) 
idx <- which(isna) 
rr <- rle(isna) 
idx <- split(idx, rep(seq(sum(rr$values)), rr$lengths[rr$values])) 
# $`1` 
# [1] 4 5 6 7 

# $`2` 
# [1] 12 13 14 

Они соответствуют грести номера ... Теперь вы может подмножество:

использование lapply:

oo <- lapply(idx, function(ix) { 
    this_sub <- df[ix, ] 
    # do whatever you want 
}) 

использование for-loop:

for (i in seq_along(idx)) { 
    this_sub <- df[idx[[i]], ] 
    # do whatever you want 
} 
0

Если вы хотите, чтобы кадр данных, содержащий все строки, которые имеют NA в столбце «C4» вы делаете:

df[which(is.na(df$C4)), ] 

где ФР вашего фрейма данных.

Надеюсь, это поможет.

+0

Это разделило бы все NA, но в моем кадре данных строки упорядочены по времени, а NA встречаются в разных группах, они не находятся в одной непрерывной строке. Вот почему я только хочу найти последний NA в группе NA, на которую я смотрю. Я отредактирую таблицу выше, чтобы дать вам лучшее понимание – user2560984

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