2015-12-08 12 views
6

Mam arkusza kalkulacyjnego Google z następującymi danymiWypełnienie brakujących danych przez interpolację w arkuszu kalkulacyjnym 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 

Chcę wykres wagi w.r.t. data i/lub użyj go z innymi kolumnami, które obliczają inne ilości poza ciężarem. Jednak zauważysz, że brakuje niektórych wpisów. Co chcę to kolejna kolumna, która ma dane, który jest oparty na kolumnie Waga z brakującymi wartościami interpolowana i wypełnione Np.

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 

W kolumnie C są wartościami wypełnione za pomocą interpolacji liniowej, gdy muszę znaleźć brakujące dane między dwoma znanymi punktami.

Uważam, że jest to bardzo prosty i powszechny przypadek użycia, więc jestem pewien, że jest to trywialne, ale nie mogę znaleźć rozwiązania za pomocą wbudowanych funkcji. Nie mam też dużego doświadczenia z arkuszami kalkulacyjnymi. Spędziłem wiele godzin eksperymentując z = INDEX, = MATCH, = VLOOKUP, = LOINEST, = TREND itd., Ale nie jestem w stanie wymyślić czegoś z przykładów. Jedynym rozwiązaniem, które mogłem wykorzystać, było utworzenie niestandardowej funkcji za pomocą Google Apps Script. Chociaż moje rozwiązanie działa, wydaje się działać bardzo powoli. Mój arkusz kalkulacyjny jest również ogromny.

Jakieś wskazówki, rozwiązania?

+0

Możesz być lepiej biorąc kod zapisany dla funkcji niestandardowej, a modyfikując go uruchomić z 'onEdit()' spust, lub coś podobnego. Funkcje prawdopodobnie przeliczają cały arkusz kalkulacyjny za każdym razem, gdy następuje zmiana. Wyzwalacz 'onEdit()' może uruchomić skrypt, który zmieni tylko wartość w komórce określonej w skrypcie. Możesz zajrzeć do dokumentacji [Link to Google Sheets Events] (https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events). –

Odpowiedz

4

Znaleziono rozwiązanie, które spełnia większość moich wymagań przy użyciu:

  1. Używane =FILTER() najpierw usunąć puste wiersze, w których dane nie są dostępne (dzięki za cynk od „pnuts”).

  2. I =MATCH() wyszukać dwa kolejne wiersze z przefiltrowanej tabeli. W moim przypadku mogłem użyć tej funkcji, ponieważ kolumna A jest posortowana i nie ma powtórzeń.

  3. A następnie za pomocą wzoru liniowego do interpolacji wartości.

więc wyjście ma postać:

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 

gdzie komórki C2 i D2 mają następujący wzór zakresu (mniej Uwaga: Następujące preparaty mogą oczywiście być łączone, jeśli kolumny A i B sąsiadują)

C2 =FILTER($A$2:$A$10, NOT(ISBLANK($B$2:$B$10))) 
D2 =FILTER($B$2:$B$10, NOT(ISBLANK($B$2:$B$10))) 

Komórki E2 przez E10 zawierać Poniższy wzór interpolacji linii [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 

co rozwiązanie to nie działa w przypadku kiedy pierwsza komórka B2 nie mają wartości, przy czym wynik wzór w # N/A. Wszystko to byłoby znacznie wydajniejsze, gdybyśmy mieli coś w rodzaju =INTERPOLATE_LINE(A2, $A$2:$A$10, $B$2:$B$10) w arkuszu kalkulacyjnym Google, ale niestety to nie istnieje. Popraw mnie, jeśli przegapiłem to w moim przeczytaniu supported functions w arkuszu kalkulacyjnym Google.

+0

Sprytne rozwiązanie, dziękuję! – electronpusher

7

Być może zechcesz użyć forecast, dla której wygodniej jest najpierw oddzielić daty od odczytów od tych, których nie znasz (i zmienić ich kolejność). Więc z zaledwie trzy odczyty powiedzieć:

 A  B 
1 10/12/2015 65 
2 14/12/2015 62 
3 16/12/2015 61 

i terminów, które są wymagane na lewo poniżej wartości:

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 

Formuła powodujące 65.6 B6 (i kopiowane stamtąd do własnych) wynosi:

=forecast(A6,$B$1:$B$3,$A$1:$A$3) 

to nie jest obliczana w zupełnie w sposób pokazać, ale mogą być uznane za nieco bardziej dokładne, w szczególności poprzez ekstrapolację brakujących wartości końcowych, R niż tylko powtarzanie ich najbliższej dostępnej wartości.

Po obliczeniu wartości prawdopodobnie chciałbyś ponownie zmontować dane w porządku daty. Sugeruję więc skopiowanie B6: B10 i Edycja, Wklej specjalnie, Wklej wartości tylko u góry, a następnie sortuj, aby pasowały.

Poniższy wykres porównuje wyniki powyżej (niebieski) z identyfikatorami w OP (zielony) i zaznacza podane punkty danych:

SO34150309 example

+1

Widzę wartość 'forcast()' jednak w moich eksperymentach, stwierdziłem, że interpoluje jako pojedyncza linia prosta pasująca do całego zakresu danych. Więc nie prześledzi punktów, w których dane są już dostępne. Idealnie byłoby, gdybym mógł użyć dopasowania splajnu zamiast interpolacji liniowej. –

1

Znalazłem rozwiązanie, które całkowicie spełnia wymagania. Użyłem oddzielnego arkusza, aby podzielić obliczenia na części.

Utwórz nowy arkusz. Wprowadź następujące formuły w komórkach A2-F2, a następnie skopiuj je na stronę.

  1. komórce A2: Kopiowanie danych wagi w pierwszej kolumnie. (W tym przykładzie, nazwa arkusza codziennie nagrywania i ciężary są zapisywane w kolumnie D)

    'Daily Record'!D2

  2. komórki B2 znaleźć ostatnią nagraną na wadze.

    =INDEX(FILTER(A$2:A2,A$2:A2 <> ""),COUNT(FILTER(A$2:A2,A$2:A2 <> "")),1)

  3. komórce C2: Policzyć liczbę dni od ostatniego ważenia.

    =IF(A2<>"",0,IF(ROW(C2)<3,0,C1+1))

  4. komórki D2: (. Od bieżącej daty lub nowszym) Znajdź następny nagrany ciężar

    =IFERROR(INDEX(FILTER(A2:A,A2:A <> ""),1,1),"")

  5. komórek E2: Policzyć liczbę dni, aż następne ważenie.

    =IF(A2<>"",0,IF(E3="","",E3+1))

  6. F2 komórek: Oblicz interpolowana na wadze.

    =IF(A2 <> "", A2, IF(D2 = "", "", B2 + (D2-B2)*C2/(C2+E2)))

Powiązane problemy