2016-02-22 4 views
3

Мой вопрос вытекает из How to find tail rows of a data frame that satisfy set criteria? и как таковой, мой (обновлено) Выборочные данные структурированы:Как удалить N строк кадра данных, в соответствии с условиями

Individ <- data.frame(Participant = c("Bill", "Bill", "Bill", "Bill", "Bill", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Bill", "Bill", "Bill", "Bill"), 
         Time = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4), 
         Condition = c("Placebo", "Placebo", "Placebo", "Placebo", "Placebo", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr", "Placebo", "Placebo", "Placebo", "Placebo", "Placebo", "Placebo", "Expr", "Expr", "Expr", "Expr"), 
         Location = c("Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Away", "Away", "Away", "Away"), 
         Power = c(400, 250, 180, 500, 300, 600, 512, 300, 500, 450, 200, 402, 210, 130, 520, 310, 451, 608, 582, 390, 570)) 

Я научился находить хвост строка для каждого Participant по разным Condition плюс Location на основе их последнего вхождения Power. Теперь я хочу удалить последние 3 строки из каждого Participant для каждого Condition и Location. Тем не менее, Time, собранный для каждого Participant и Condition, отличается и, следовательно, я не могу удалять строки исключительно на основе стандартного Time.

Как быстро прокрутить каждый Participant и их соответствующие Condition плюс Location и удалить последние 3 строки? Мой фактический фрейм данных составляет 4 миллиона строк + с более чем 50 участниками, поэтому в идеале желательно, чтобы решение, которое выполняет итерации по каждому из Participant и Condition.

Мой ожидаемый результат будет:

Output <- data.frame(Participant = c("Bill", "Bill", "Jane", "Jane", "Jane", "Jane", "Jane", "Jane", "Bill"), 
        Time = c(1, 2, 1, 2, 3, 1, 2, 3, 1), 
        Condition = c("Placebo", "Placebo", "Expr", "Expr", "Expr", "Placebo", "Placebo", "Placebo", "Expr"), 
        Location = c("Home", "Home", "Home", "Home", "Home", "Home", "Home", "Home", "Away"), 
        Power = c(400, 250, 600, 512, 300, 402, 210, 130, 608)) 

ответ

2

Если вы используете dplyr, с row_number() и n() ...

library(dplyr) 
Individ %>% 
    group_by(Participant, Condition, Location) %>% 
    filter(row_number() < n() - 2) 

возвращает

Source: local data frame [9 x 5] 
Groups: Participant, Condition, Location [4] 

    Participant Time Condition Location Power 
     (fctr) (dbl) (fctr) (fctr) (dbl) 
1  Bill  1 Placebo  Home 400 
2  Bill  2 Placebo  Home 250 
3  Jane  1  Expr  Home 600 
4  Jane  2  Expr  Home 512 
5  Jane  3  Expr  Home 300 
6  Jane  1 Placebo  Home 402 
7  Jane  2 Placebo  Home 210 
8  Jane  3 Placebo  Home 130 
9  Bill  1  Expr  Away 608 
+0

Кто знал, что это будет так легко ?! Благодарим вас за решение 'dplyr'. – user2716568

2

Возможность использования data.table. Мы преобразуем «data.frame» в «data.table» (setDT(Individ)), сгруппированные по «Участнику», «Условие» и «Местоположение», мы удаляем последние 3 наблюдения для каждой комбинации, используя head.

library(data.table) 
setDT(Individ)[, head(.SD, -3) , .(Participant, Condition, Location)] 
# Participant Condition Location Time Power 
#1:  Bill Placebo  Home 1 400 
#2:  Bill Placebo  Home 2 250 
#3:  Jane  Expr  Home 1 600 
#4:  Jane  Expr  Home 2 512 
#5:  Jane  Expr  Home 3 300 
#6:  Jane Placebo  Home 1 402 
#7:  Jane Placebo  Home 2 210 
#8:  Jane Placebo  Home 3 130 
#9:  Bill  Expr  Away 1 608 

Эквивалент вариант в dplyr является

library(dplyr) 
Individ %>% 
    group_by(Participant, Condition, Location) %>% 
    do(head(., -3)) 
# Participant Time Condition Location Power 
#  (fctr) (dbl) (fctr) (fctr) (dbl) 
#1  Bill  1  Expr  Away 608 
#2  Bill  1 Placebo  Home 400 
#3  Bill  2 Placebo  Home 250 
#4  Jane  1  Expr  Home 600 
#5  Jane  2  Expr  Home 512 
#6  Jane  3  Expr  Home 300 
#7  Jane  1 Placebo  Home 402 
#8  Jane  2 Placebo  Home 210 
#9  Jane  3 Placebo  Home 130 
Смежные вопросы