Как я могу идентифицировать и суммировать наборы данных из соответствующих групп в кадре данных? - PullRequest
1 голос
/ 29 августа 2011

Вот пример кадра данных:

set.seed(0)
x1 <- c(1, 1, 1, 1, 1, 2, 2, 2, 2)
x2 <- c(1, 1, 0, 0, 0, 1, 1, 1, 1)
x3 <- c(1, 1, 2, 2, 4, 1, 1, 2, 1)
n  <- c(1, 1, 1, 5, 5, 1, 1, 1, 1)
y <- rnorm(9)

mydf <- data.frame(x1, x2, x3, n, y)

Я хотел бы сделать следующее:

  1. идентифицировать строки с n = 1 и имеющие одинаковые значения (x1, x2, x3)
  2. возвращает одну строку для каждого подмножества с y = mean (y) и n = length (y)
  3. , оставляя другие строки одинаковыми.

например, новый фрейм данных будет

x1 <- c(1,            1,    1,    1,    2,                 2)
x2 <- c(1,            0,    0,    0,    1,                 1)
x3 <- c(1,            2,    2,    4,    1,                 2)
n  <- c(2,            1,    5,    5,    3,                 1)
y  <- c(mean(y[1:2]), y[3], y[4], y[5], mean(y[c(6:7,9)]), y[8])

newdf <- data.frame(x1, x2, x3, n, y)

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

1 Ответ

4 голосов
/ 29 августа 2011

Под «идентичными значениями в других столбцах» я понимаю, что вы имеете в виду, что каждое подмножество определяется одинаковым значением x1 в каждой из строк подмножества, а не x1 равно x2,Спасибо за пример, чтобы увидеть, что вы имели в виду.

library("plyr")

Для получения первой и второй частей

ddply(mydf[mydf$n==1,], .(x1, x2, x3), summarise, n = length(y), y = mean(y))

Это может быть rbind -ед с частью mydf гдеn!=1 чтобы получить то, что вы сказали

rbind(
  ddply(mydf[mydf$n==1,], .(x1, x2, x3), summarise, n = length(y), y = mean(y)),
  mydf[mydf$n!=1,]
)

Это не тот же порядок, что вы перечислили.Если это действительно важно, вы можете добавить некоторые вспомогательные переменные сортировки.

mydf$order = seq(length=nrow(mydf))
newdf <- rbind(
  ddply(mydf[mydf$n==1,], .(x1, x2, x3), summarise, 
    n = length(y), y = mean(y), order=min(order)),
  mydf[mydf$n!=1,]
)
newdf <- newdf[order(newdf$order),]
newdf$order <- NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...