2015-12-08 12 views
6

Ho Google Spreadsheet con i seguenti datiFill i dati di interpolazione mancante in Google Spreadsheet

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 

voglio rappresentare graficamente il peso w.r.t. data e/o usarlo con altre colonne che calcolano altre quantità dal peso. Tuttavia noterai che ci sono delle voci mancanti. Quello che voglio è un'altra colonna che contiene i dati che si basa sulla colonna Peso con valori mancanti interpolati e compilati esempio:.

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 

Nella colonna C sono valori inseriti nei mediante interpolazione lineare quando devo trovare i dati mancanti tra due punti noti.

Credo che questo sia un caso di uso molto semplice e comune, quindi sono sicuro che sia una cosa banale da fare, ma non sono in grado di trovare una soluzione utilizzando le funzioni incorporate. Neanche io ho molta esperienza con i fogli di calcolo. Ho trascorso ore a sperimentare con = INDICE, = MATCH, = VLOOKUP, = LINEST, = TREND ecc., Ma non sono in grado di trovare qualcosa dagli esempi. L'unica soluzione che potevo usare era creare una funzione personalizzata usando Google Apps Script. Sebbene la mia soluzione funzioni, sembra che venga eseguita molto lentamente. Anche il mio foglio di calcolo è enorme.

Eventuali puntatori, soluzioni?

+0

Si potrebbe essere meglio prendere il codice che hai scritto per la funzione personalizzata, e modificando l'esecuzione da un 'onEdit()' innesco, o qualcosa di simile. Le funzioni probabilmente ricalcolano l'intero foglio di calcolo ogni volta che c'è una modifica. Un trigger 'onEdit()' può eseguire uno script che cambierà solo il valore nella cella specificata nello script. Potresti voler consultare la documentazione [Link a Google Fogli Eventi] (https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events). –

risposta

4

trovato una soluzione che soddisfa la maggior parte delle mie esigenze utilizzando:

  1. Usato =FILTER() prima rimuovere righe vuote in cui i dati non è disponibile (grazie per una punta da "pnuts").

  2. E =MATCH() per cercare due righe consecutive dalla tabella filtrata. Nel mio caso sono stato in grado di utilizzare questa funzione perché la colonna A è ordinata e non ha ripetizioni.

  3. E quindi utilizzare la formula di linea per interpolare i valori.

Così l'uscita diventa:

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 

Dove cellule C2 e D2 hanno la seguente formula gamma (nota minore: le seguenti formule possono naturalmente essere combinati se colonne A e B sono adiacenti):

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

Cells E2 attraverso E10 contengono la seguente formula di interpolazione linea: [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 

Cosa questa soluzione non funziona per è quando la prima cella B2 non ha un valore, in cui il risultato formula a # N/A. Tutto questo sarebbe stato molto più efficiente se avessimo qualcosa come =INTERPOLATE_LINE(A2, $A$2:$A$10, $B$2:$B$10) nel foglio di calcolo di Google, ma sfortunatamente questo non esiste. Per favore correggimi se mi sono perso nella lettura dello supported functions nel foglio di calcolo di Google.

+0

Soluzione intelligente, grazie! – electronpusher

7

Si potrebbe voler usare forecast per il quale potrebbe essere più conveniente prima separare le date che si hanno da quelle che non si (e riorganizzare in seguito). Quindi, con solo tre letture dicono:

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

e le date per le quali sono richiesti i valori in basso a sinistra:

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 

La formula dando luogo a 65.6 in B6 (e copiato giù da lì per soddisfare) è:

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

Questo non è calcolato in modo del tutto il modo in cui si mostra, ma può essere considerato un po 'più accurata, in particolare estrapolando i valori finali mancanti, r oltre a ripetere il valore più vicino disponibile.

Dopo aver calcolato i valori, è probabile che si desideri riassemblare i dati in ordine di data. Quindi suggerisco di copiare B6: B10 e Modifica, Incolla speciale, Incolla valori solo sopra e poi riordinare.

Il grafico seguente mette a confronto i risultati di cui sopra (blu) con quelli in OP (verde) e segna il dato punti di dati:

SO34150309 example

+1

Riesco a vedere il valore di 'forcast()', tuttavia, nei miei esperimenti, ho trovato che si interpola come una singola linea retta che si adatta all'intero intervallo di dati. Quindi non traccerà i punti in cui i dati sono già disponibili. Idealmente, mi sarebbe piaciuto se potessi usare un raccordo spline invece di un'interpolazione lineare. –

1

Ho trovato una soluzione che soddisfa completamente i requisiti. Ho usato un foglio separato in modo da poter suddividere il calcolo in pezzi.

Creare un nuovo foglio. Immettere le seguenti formule nelle celle A2-F2 e quindi copiarle nella pagina.

  1. cellulare A2: copiare i dati di peso nella prima colonna. (In questo esempio, il nome del foglio è Daily Record ed i pesi sono registrati nella colonna D.)

    'Daily Record'!D2

  2. cellulare B2: Trova il più recente peso registrato.

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

  3. cellulare C2: Contare il numero di giorni da quando il più recente peso-in.

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

  4. cellulare D2: (. Dalla data corrente o successivo) Trovare il peso registrato prossima

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

  5. cellulare E2: Contare il numero di giorni fino a quando la prossima pesata.

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

  6. cellulare F2: calcolare il peso interpolato.

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