Итеративно привязать 10% данных из фрейма данных и построить график

У меня есть три фрейма данных, каждый из которых имеет 1 столбец, но имеет разное количество строк 100,100,1000 для df1, df2, df3 соответственно. Я хочу выполнить rbind итеративно и многократно вычислять такие меры, как среднее значение для небольших фрагментов данных, каждый раз принимая 10% данных. Это означает, что на первой итерации мне нужно иметь 10 строк из df1, 10 из df2 и 100 из df3, и для этого набора мне нужно получить среднее значение, и процесс должен продолжаться 10 раз. И мне нужно построить фрагменты итераций с течением времени, показывающие среднее значение по оси Y по итерациям, и получить общее среднее значение с помощью этой процедуры. Какие-либо предложения?

df1<- data.frame(A=c(1:100))
df2<- data.frame(A=c(1:100))
df3<- data.frame(A=c(1:1000))

library(dplyr)
for i in (1:10)
     { df[i]<- rbind_list(df1,df2,df3)
      mean=mean(df$A)} 

person user3570187    schedule 21.09.2015    source источник


Ответы (1)


Вы усложняете ситуацию, пытаясь сохранить отдельные фреймы данных. Добавьте столбец "group" - назовите его "итерацией", если хотите - и получите данные в одном фрейме данных:

df1$group = rep(1:10, each = nrow(df1) / 10)
df2$group = rep(1:10, each = nrow(df2) / 10)
df3$group = rep(1:10, each = nrow(df3) / 10)
df = rbind(df1, df2, df3)

means = group_by(df, group) %>% summarize(means = mean(A))
means
#  Source: local data frame [10 x 2]
#
#     group means
#  1      1    43
#  2      2   128
#  3      3   213
#  4      4   298
#  5      5   383
#  6      6   468
#  7      7   553
#  8      8   638
#  9      9   723
# 10     10   808

Ваше общее среднее значение mean(df$A). Вы можете строить с with(means, plot(group, means)).

Редактирует:

Если группы не выходят точно, вот как я бы назначил столбец группы. Убедитесь, что ваш dplyr обновлен, для этого используется аргумент .id из bind_rows(), который был новым в этом месяце в версии 0.4.3.

library(dplyr)
# dplyr > 0.4.3

df = bind_rows(df1, df2, df3, .id = "id")
df = df %>% group_by(id) %>%
    mutate(group = (0:(n() - 1)) %/% (n() / 10) + 1)

Столбец id сообщает вам, из какого фрейма данных взята строка, а столбец group разбивает его на 10 групп. Остальная часть кода выше должна работать нормально.

person Gregor Thomas    schedule 21.09.2015
comment
Спасибо! У меня были нечетные числа, поэтому почему-то не могу их сгруппировать. Любые идеи? - person user3570187; 22.09.2015