Заполнить недостающие данные путем интерполяции в таблице Google
У меня есть таблица Google со следующими данными
A B D
1 Date Weight Computation
2 2015/12/09 =B2*2
3 2015/12/10 65 =B3*2
4 2015/12/11 =B4*2
5 2015/12/12 =B5*2
6 2015/12/14 62 =B6*2
7 2015/12/15 =B7*2
8 2015/12/16 61 =B8*2
9 2015/12/17 =B9*2
Я хочу построить график веса w.r.т. дата, и / или использовать его с другими столбцами, которые вычисляют другие величины от веса. Однако вы заметите, что есть некоторые недостающие элементы. Я хочу другой столбец, в котором есть данные, основанные на столбце Weight с интерполированными и заполненными отсутствующими значениями. Например:
A B C D
1 Date Weight WeightI Computation
2 2015/12/09 65 =C2*2 # use first known value
3 2015/12/10 65 65 =C3*2
4 2015/12/11 64 =C4*2 # =(62-65)/3*(1)+65
5 2015/12/12 63 =C5*2 # =(62-65)/3*(2)+65
6 2015/12/14 62 62 =C6*2
7 2015/12/15 61.5 =C7*2 # =(61-62)/2*(1)+62
8 2015/12/16 61 61 =C8*2
9 2015/12/17 61 =C9*2 # use the last known value
в столбце C значения заполняются с помощью линейной интерполяции, когда у меня есть найти недостающие данные между двумя известными точками.
Я считаю, что это действительно простой и распространенный случай использования, поэтому я уверен, что это тривиальная вещь, но я не могу найти решение, используя встроенные функции. У меня тоже нет опыта работы с электронными таблицами. Я часами экспериментировал с = INDEX, =MATCH, =VLOOKUP, =LINEST, =TREND и т. д., но я не могу придумать что-то из примеров. Единственным решением, которое я мог использовать, было создание пользовательской функции с помощью Скрипт Google Apps. Хотя мое решение работает, оно, кажется, выполняется очень медленно. Моя таблица также огромна.
какие-нибудь советы, решения?
3 ответов
вы можете использовать forecast
для которого может быть удобнее сначала отделить даты, которые у вас есть показания от тех, которые у вас нет (и изменить позже). Так что с помощью всего трех чтений скажите:
A B
1 10/12/2015 65
2 14/12/2015 62
3 16/12/2015 61
и даты, для которых требуются значения слева ниже:
6 09/12/2015 65.6
7 11/12/2015 64.3
8 12/12/2015 63.6
9 15/12/2015 61.5
10 17/12/2015 60.2
формула, порождающая 65.6
в B6 (и скопировано оттуда в костюм):
=forecast(A6,$B:$B,$A:$A)
Это не рассчитывается так, как вы показываете, но может быть считается несколько более точным, в частности путем экстраполяции недостающих конечных значений, а не просто повторения их ближайшего доступного значения.
рассчитав значения, вы, вероятно, захотите собрать данные в порядке дат. Поэтому я предлагаю скопировать B6:B10 и отредактировать, вставить специальный, вставить значения только сверху, а затем сортировка в соответствии.
на диаграмме ниже сравниваются результаты выше (синий) с результатами в вашем OP (зеленый) и помечается данный точки данных:
найдено решение, которое удовлетворяет большинству моих требований, используя:
используется
=FILTER()
сначала удалить пустые строки, где данные недоступны (спасибо за подсказку от "pnuts").и
=MATCH()
для просмотра двух последовательных строк из отфильтрованной таблицы. В моем случае я смог использовать эту функцию, потому что столбецA
занимает и не имеет повторений.и после этого используя формулу линии к интерполировать значения.
таким образом, выход становится:
A B C D E
1 Date Weight FDdate FWeight IWeight
2 2015/05/09 2015/05/10 65.00 #N/A
3 2015/05/10 65.00 2015/05/13 62.00 65.00
4 2015/05/11 2015/05/15 61.00 64.00
5 2015/05/12 63.00
6 2015/05/13 62.00 62.00
7 2015/05/14 61.50
8 2015/05/15 61.00 61.00
9 2015/05/16 61.00
10 2015/05/17 61.00
где клетки C2
и D2
имеют следующую формулу диапазона (незначительное Примечание: следующие формулы, конечно, могут быть объединены, если столбцы A
и B
находятся рядом):
C2 =FILTER($A:$A, NOT(ISBLANK($B:$B)))
D2 =FILTER($B:$B, NOT(ISBLANK($B:$B)))
клетки E2
через E10
содержит следующую формулу интерполяции строк: [y = y1 + (y2 - y1) / (x2 - x1) * (x - x1)
]:
E2 =(INDEX($D:$D, MATCH($A2, $C:$C, 1), 1))
+(INDEX($D:$D, MATCH($A2, $C:$C, 1) + 1, 1)
- INDEX($D:$D, MATCH($A2, $C:$C, 1), 1))
/(INDEX($C:$C, MATCH($A2, $C:$C, 1) + 1, 1)
- INDEX($C:$C, MATCH($A2, $C:$C, 1), 1))
*(INDEX($C:$C, MATCH($A2, $C:$C, 1), 1) - $A2) * -1
для чего это решение не работает, когда первый ячейка B2
не имеет значения, где результат формулы в #N / A. Все это было бы намного эффективнее, если бы у нас было что-то вроде =INTERPOLATE_LINE( A2, $A:$A, $B:$B )
в электронной таблице google, но, к сожалению, этого не существует. Пожалуйста, поправьте меня, если я пропустил это в моем чтении поддерживаемые функции в электронной таблице google.
Я нашел решение, которое полностью удовлетворяет требованиям. Я использовал отдельный лист, чтобы разбить расчет на части.
создать новый лист. Введите следующие формулы в ячейки A2-F2, а затем скопируйте их вниз по странице.
-
Ячейка A2: скопируйте данные о весе в первый столбец. (В этом примере имя листа-ежедневная запись, а веса записываются в столбец Д.)
'Daily Record'!D2
-
Ячейки B2: найти самый последний записанный вес.
=INDEX(FILTER(A:A2,A:A2 <> ""),COUNT(FILTER(A:A2,A:A2 <> "")),1)
-
Ячейка C2: подсчитать количество дней с момента последнего взвешивания.
=IF(A2<>"",0,IF(ROW(C2)<3,0,C1+1))
-
Ячейка D2: найти следующий записанный вес (с текущей даты или позже.)
=IFERROR(INDEX(FILTER(A2:A,A2:A <> ""),1,1),"")
-
Ячейки E2: подсчитать количество дней до следующего взвешивания.
=IF(A2<>"",0,IF(E3="","",E3+1))
-
Ячейка F2: вычислить интерполированные вес.
=IF(A2 <> "", A2, IF(D2 = "", "", B2 + (D2-B2)*C2/(C2+E2)))