У меня есть начальный фрейм данных, который выглядит примерно так, как показано ниже.Тот же базовый формат (заголовки, все соответствующие значения являются числовыми. Та же самая черта, что Time.Start и Time.End имеют меньшее количество уникальных значений
#df1
Time.Start Time.End Lead Result Count
[1] 1 0 1 1 1
[2] 2 1 1 .5 1
[3] 1 0 1 1 1
[4] 3 1 1 0 1
[5] 6 2 2 1 1
[6] 4 3 2 0 1
[7] 5 2 1 1 1
[8] 3 1 1 0 1
[9] 3 2 2 1 1
[10] 2 0 2 1 1
[11] 7 2 1 0 1
[12] 2 1 1 .5 1
[13] 9 0 2 1 1
[14] 0 0 2 1 1
[15] 8 3 1 .5 1
Я хочу взять эти значения и поместить их в кадр данных илиматрица, которая выглядит следующим образом.
Time <- 0:10
#df2
Time Lead.1
0 sum(Result)/sum(Count) at df$Lead=1 df$Time.Start>=0 & df$Time.End<=0
1 sum(Result)/sum(Count) at df$Lead=1 df$Time.Start>=1 & df$Time.End<=1
2 sum(Result)/sum(Count) at df$Lead=1 df$Time.Start>=2 & df$Time.End<=2
... ...
10 sum(Result)/sum(Count) at df$Lead=1 df$Time.Start>=10 & df$Time.End<=10
Хитрость в том, что я не могу просто найти каждую точку, где время равно Time.Start или Time.End, мне также нужна каждая точка, где время находится между илисоответствует строке Time.Start или Time.End. Поэтому для Time = 2 из примера df я бы хотел получить сумму значений в строках, 2, 4, 5, 7, 8, 9, 10, 11 и 12.Для каждого отдельного значения отведения будет создан отдельный вектор, причем все отведения из 4 или более будут объединены в один
. Если бы я захотел сгенерировать это вручную, я мог бы. Формула ниже может быть использована для нахожденияэто в любое время и для любого отведения.
sum(df[df$Lead==1 & df$Time.End<=t & df$Time.Start>=t,"Result")]/
sum(df[df$Lead==1 & df$Time.End<=t & df$Time.Start>=t,"Count")]
Это не практичное решение, поскольку фактический набор данных имеет 300 различных значений времени, а не 11. Сначала я попытался создать цикл for
Lead1 <- for(i in Time){
sum(df$Lead.Group=="1" & df[df$Time.End<=i & df$Time.Start>=i,"Result"])/
sum(df$Lead.Group=="1" & df[df$Time.End<=i & df$Time.Start>=i,"Count"])
}
Это тольковыведите пару сотен сообщений об ошибке «длина объекта не кратна длине объекта».Я получил те же результаты при использовании функции by ().
Если уместно, цель после генерации второго кадра данных состоит в том, чтобы создать диаграмму рассеяния из каждого значения отведений, изменяющегося со временем.Это должно быть довольно легко управляемо с ggplot2