2016-06-10 2 views
3

У меня есть фрейм данных, похожий наУдаление хвоста данных по группам в R

df <- data.frame(group=c("a", "b"), value=1:16,trim=rep(1:2)) 

Я пытаюсь выяснить, как я могу удалить последние строки каждой группы. Количество строк для удаления из каждой группы определяется в переменной «trim».
я понял, как удалить определенное количество строк из всех групп с использованием

x<-do.call("rbind", lapply(split(df, df$group), head,-2)) 

Однако, я не могу понять, как я бы удалить несколько строк из группы, указанной в колонка «обрезка». Другими словами, я хотел бы, чтобы группа a имела последний отрезанный ряд, а группа b - последние две строки, обрезанные.

ответ

2

Вот метод, использующий data.table (заимствование из @ 42 по методу):

library(data.table) 
setDT(df) 
df[, head(.SD, -trim[1]), by=group] 

который выводит:

group value trim 
1:  a  1 1 
2:  a  3 1 
3:  a  5 1 
4:  a  7 1 
5:  a  9 1 
6:  a 11 1 
7:  a 13 1 
8:  b  2 2 
9:  b  4 2 
10:  b  6 2 
11:  b  8 2 
12:  b 10 2 
13:  b 12 2 
2

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

library(dplyr) 

df %>% group_by(group) %>% slice(1:(n() - trim[1])) # Per @42-, this is faster than unique(trim) 
group value trim 
1  a  1  1 
2  a  3  1 
3  a  5  1 
4  a  7  1 
5  a  9  1 
6  a 11  1 
7  a 13  1 
8  b  2  2 
9  b  4  2 
10  b  6  2 
11  b  8  2 
12  b 10  2 
13  b 12  2 
5

Попытка вывести первое значение в группе:

Обычно я проверить мои ответы, но делает это от iPhone на прыгающий поезде.

+0

Спасибо за это. Прекрасно работает – Jdan

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