Объединение данных по значениям строк с минимальным размером выборки
Я пытаюсь выяснить, как создать ячейки с минимальным размером выборки, который также учитывает значения в определенном столбце.
Итак, в фиктивных данных, приведенных ниже, я хочу создать ячейки с минимальным количеством 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