Выберите первые 80 наблюдений для каждого уровня в R

У меня есть набор данных, который выглядит так:

structure(list(A = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25"), class = "factor"), T = c(0.04, 0.08, 0.12, 0.16, 0.2, 
0.24), X = c(464.4, 464.4, 464.4, 464.4, 464.4, 464.4), Y = c(418.5, 
418.5, 418.5, 418.5, 418.5, 418.5), V = c(0, 0, 0, 0, 0, 0), 
    GD = c(0, 0, 0, 0, 0, 0), ND = c(NA, 0, 0, 0, 0, 0), ND2 = c(NA, 
    0, 0, 0, 0, 0), TID = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("t1", 
    "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", 
    "t19", "t2", "t20", "t21", "t22", "t23", "t24", "t25", "t3", 
    "t4", "t5", "t6", "t7", "t8", "t9"), class = "factor")), .Names = c("A", 
"T", "X", "Y", "V", "GD", "ND", "ND2", "TID"), row.names = c(NA, 
6L), class = "data.frame")

Я хочу выбрать первые 80 наблюдений всех переменных для каждого TID. Пока что я могу сделать это с первым TID только с помощью кода:

sub.data1<-NM[1:80, ]

Как я могу сделать это для всех других моих TID?

Спасибо!

4 ответа

Решение

Используя функцию ddply() от plyr Вы можете разделить данные по TID, а затем выберите Forst 80 с head() а затем снова поместить все в один фрейм данных,

library(plyr)
ddply(NM, .(TID), head, n = 80)

Я бы сделал:

lapply(split(dat, dat$TID), head, 80)

Возвращает список data.frames с 80 (или менее) строками. Если вместо этого вы хотите все в один data.frame:

do.call(rbind, lapply(split(dat, dat$TID), head, 80))

Используя таблицы данных, я сделал более короткий пример с TID t1 и t2, который возвращает первые 2 строки t1 и t2. Это может быть скорректировано для ваших данных.

library(data.table)
data<-structure(list(A = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("1", 
                "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
                "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
                "25"), class = "factor"), T = c(0.04, 0.08, 0.12, 0.16, 0.2, 
                0.24), X = c(464.4, 464.4, 464.4, 464.4, 464.4, 464.4), Y = c(418.5, 
                        418.5, 418.5, 418.5, 418.5, 418.5), V = c(0, 0, 0, 0, 0, 0), 
                GD = c(0, 0, 0, 0, 0, 0), ND = c(NA, 0, 0, 0, 0, 0), ND2 = c(NA, 
                        0, 0, 0, 0, 0), TID = c("t1","t1","t1","t2","t2","t2")), .Names = c("A", 
                "T", "X", "Y", "V", "GD", "ND", "ND2", "TID"), row.names = c(NA, 
                6L), class = "data.frame")
dt<-data.table(data)
dt[,head(.SD,2),by=TID]

Это приводит к:

   TID A    T     X     Y V GD ND ND2
1:  t1 1 0.04 464.4 418.5 0  0 NA  NA
2:  t1 1 0.08 464.4 418.5 0  0  0   0
3:  t2 1 0.16 464.4 418.5 0  0  0   0
4:  t2 1 0.20 464.4 418.5 0  0  0   0

и при желании можно изменить обратно на фрейм данных, изменив последнюю строку на

as.data.frame(dt[,head(.SD,2),by=TID])

Вот еще одно решение в базе:

do.call(rbind, by(NM, NM$TID, head, 80))
Другие вопросы по тегам