выбор наблюдений путем объединения критериев в R

Эта тема, вероятно, поднималась, и я думаю, что это довольно простое решение. Однако я не мог сделать это до сих пор. Допустим, у меня есть data.frame (называемый «данные»), который содержит 10 человек (id), на которых я собирал наблюдения в 3 момента времени (T)

> data <- data.frame(id = rep(c(1:10), 3),
                     T  = gl(3, 10),
                     X  = sample(1:30),
                     Y  = sample(c("yes", "no"), 30, replace = TRUE),
                     Z  = sample(1:40, 30),
                     Z2 = rnorm(30, mean = 5, sd = 0.5))

    > head(data)
      id T  X   Y  Z       Z2
    1  1 1 10 yes 15 5.993605
    2  2 1 18  no 22 6.096566
    3  3 1  5  no 24 5.101393
    4  4 1 15 yes 18 4.944108
    5  5 1 23  no 34 4.634176
    6  6 1 13  no 27 5.576015

Я хотел бы создать подмножество этого data.frame (новый data.frame с именем data2), выбрав только людей, у которых есть «да» (переменная Y) для каждой из трех точек времени (переменная T), что означает Y = "да" для Т=1 и Т=2 и Т=3.

Я знаю, что комбинирование условий может быть достигнуто с помощью знака «&», и его можно использовать для связывания условий для трех моментов времени. Однако моя проблема состоит в том, чтобы написать каждое условие для каждой временной точки: как сказать R, что мне нужны темы, для которых, например, Y = "да" в T = "1"?

Заранее всем большое спасибо. Хорошего дня,

Денис


person den    schedule 26.05.2013    source источник


Ответы (1)


Ты можешь сделать:

keep.ids <- tapply(data$Y, data$id, FUN = function(x)all(x == "yes"))
subset(data, keep.ids[factor(id)])

Или используйте пакет plyr:

library(plyr)
ddply(data, "id", function(x) if(all(x$Y == "yes")) x else NULL)
person flodel    schedule 26.05.2013
comment
Спасибо, Флодель, это то, что я хотел сделать, и это работает очень хорошо. (я попробовал ваше предложение plyr). - person den; 26.05.2013
comment
На самом деле, это решение работает в предложенном мной примере, но не в реальном фрейме данных, над которым я работаю: есть ли другой способ выбора с использованием синтаксиса, подобного этому: subset(data, Y==yes %in% T= =1 & Y==yes %in% T==2 & Y==yes %in% T==3) ? Заранее спасибо, если вы можете мне помочь. Денис - person den; 02.06.2013
comment
Вы не говорите, почему это не работает с вашими реальными данными. Можете ли вы предоставить небольшой образец данных, демонстрирующий проблему? Возможно, отредактируйте свой вопрос или, скорее, начните новый, поскольку я уже правильно ответил на этот вопрос ... Отказ от принятия моего ответа был, на мой взгляд, немного неуместным. - person flodel; 02.06.2013
comment
извините, ваш ответ сработал хорошо, и я только что упомянул об этом. Как я могу это принять? я сделаю это. Извините, я не знаком с тем, как именно работает этот форум. - person den; 02.06.2013
comment
С моими данными data.frame, возвращаемый R, содержит строки, которые не являются тремя повторениями одного и того же идентификатора, как это должно быть (один для T == 1, один для T == 2 и один для T == 3 ). Иногда я получаю только одну строку для данного идентификатора. - person den; 02.06.2013
comment
Трудно сказать без образцов данных, но, возможно, попробуйте заменить FUN выше на function(x)all(x == "yes") & length(x) == 3. Или в случае plyr используйте function(x) if(all(x$Y == "yes") & all(x$T %in% 1:3)) x else NULL. Чтобы принять ответ, отметьте большую галочку слева. - person flodel; 02.06.2013
comment
Еще раз спасибо. Я попробую это и вернусь к вам. - person den; 02.06.2013
comment
Я только что попробовал это, но это работает: теперь я не получаю строку в data.frame. На самом деле, я не понимаю, как устроена эта функция ddply, хотя на примере она работала. Например, я не понимаю, почему мы должны упоминать переменную id: выбор не зависит от нее. - person den; 02.06.2013