2016-08-06 3 views
0

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

Итак, в фиктивных данных, приведенных ниже, я хочу создать бункеры с минимальным количеством из 6 образцов в них, но если в ящике есть строка с определенным значением из столбца a, я хочу, чтобы этот bin также включал все остальные строки с тем же значением. Я также не хочу, чтобы в одном ящике содержалось только одно уникальное значение из строки 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),] 

Проблема у меня в том, что я не могу выяснить, как не иметь один бит с одним уникальным значением в столбце a. Например, в третьем бункере все 6 строк имеют значение. A $ a = 7, но я хотел бы добавить следующую последовательную строку и все строки с этим значением строки в столбце a в этот бит (который будет представлять все строки, которые имеют среднее значение. 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 
+0

Спасибо, это сработало Великий! – tnl393

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