Объединение данных по значениям строк с минимальным размером выборки

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

Итак, в фиктивных данных, приведенных ниже, я хочу создать ячейки с минимальным количеством 6 выборок, но если в корзине есть строка с определенным значением из столбца a, я хочу, чтобы эта корзина также включала все остальные строки с это же значение. Я также не хочу, чтобы какие-либо ячейки содержали только 1 уникальное значение из строки a. Затем я хочу, чтобы выходные данные имели строку со средним значением уникальных значений в столбце a, средним значением всех значений в столбце b и столбцом с размером выборки.

 df<-data.frame(a=c(1,1,2,2,2,3,3,3,3,4,4,5,6,6,6,7,7,7,7,7,7,8,8,8,9,9,9,9,10,10,10),
           b=c(12,13,11,12,12,11,15,13,12,11,14,15,11,14,12,11,14,12,13,15,11,11,12,13,14,16,14,13,15,13,15))

Я хочу, чтобы вывод выглядел примерно так:

  mean.a   mean.b n
1    2.0 12.33333 9
2    5.0 12.83333 6
3    7.0 12.66667 6
4    8.5 13.28571 7

Это то, что я до сих пор:

x<-df
final<-NULL

for(i in 1:16){
  x1<-x[1:6,]
  x2<-x[-c(1:6),]
  x3<-rbind(x1, x2[x2$a==x1$a[6],])
  n<-nrow(x3)
  y<-mean(x3$b)
  z<-mean(unique(x3$a))
  f<-data.frame(mean.a=z, mean.b=y, n=n)
  final<-rbind(final,f)
  x<-x[-c(1:n),]
}
final<-final[complete.cases(final),]

У меня проблема в том, что я не могу понять, как не иметь один столбец с одним уникальным значением в столбце а. Например, в третьем бине все 6 строк имеют mean.a$a=7, но я бы хотел добавить следующую последовательную строку и все строки с этим значением строки в столбце a в этот бин (который будет представлять собой все строки, которые в этом случае имеют значение. $a=8).

Кроме того, я не могу понять, как заставить цикл продолжать цикл, не имея 1: число наверху, а затем просто удаляя строки с символами NA после этого, это не так уж сложно, но это причина, по которой это так грязный

Я никоим образом не связан с этим циклом, и если есть более простой способ ответить на этот вопрос, я полностью за него!

1 ответ

Решение

Вот рекурсивное решение проблемы, где get_6 вернет групповую переменную на основе столбца a, Условия выполняются в get_i функция внутри, начиная с индекса 6 и двигаться вперед, пока мы не найдем следующий индекс, который не равен текущему значению, а длина уникальных значений не равна 1каждый раз, когда мы нашли последовательность, которая удовлетворяет условию, мы увеличиваем id по одному, и результат будет похож на то, что вы получите от rleid функция от data.tableотсюда можно рассчитать сводную статистику на основе этой групповой переменной:

get_6 <- function(vec, id = 1) {
    if(length(vec) < 6) NULL
    else {
        get_i <- function(x, i = 6) {
            if(length(x) == i) i
            else if(x[i + 1] != x[i] && length(unique(x[1:i])) != 1) i
            else get_i(x, i + 1)
        }
        ind <- get_i(vec)
        c(rep(id, ind), get_6(vec[-(1:ind)], id + 1))
    }
}

s <- get_6(df$a)
s
# [1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4

library(dplyr)
df[1:length(s), ] %>% 
                      mutate(g = s) %>% group_by(g) %>% 
                      summarize(n = n(), mean.a = mean(unique(a)), mean.b = mean(b))

#Source: local data frame [4 x 4]

#      g     n mean.a   mean.b
#  <dbl> <int>  <dbl>    <dbl>
#1     1     9    2.0 12.33333
#2     2     6    5.0 12.83333
#3     3     9    7.5 12.44444
#4     4     7    9.5 14.28571
Другие вопросы по тегам