pivot_wider-Problem "Werte in" values_from "werden nicht eindeutig identifiziert. Die Ausgabe enthält Listenspalten. “


8

Meine Daten sehen folgendermaßen aus:

# A tibble: 6 x 4
  name          val time          x1
  <chr>       <dbl> <date>     <dbl>
1 C Farolillo     7 2016-04-20  51.5
2 C Farolillo     3 2016-04-21  56.3
3 C Farolillo     7 2016-04-22  56.3
4 C Farolillo    13 2016-04-23  57.9
5 C Farolillo     7 2016-04-24  58.7
6 C Farolillo     9 2016-04-25  59.0

Ich versuche, die pivot_widerFunktion zu verwenden, um die Daten basierend auf der nameSpalte zu erweitern. Ich benutze den folgenden Code:

yy <- d %>% 
  pivot_wider(., names_from = name, values_from = val)

Welches gibt mir die folgende Warnmeldung:

Warning message:
Values in `val` are not uniquely identified; output will contain list-cols.
* Use `values_fn = list(val = list)` to suppress this warning.
* Use `values_fn = list(val = length)` to identify where the duplicates arise
* Use `values_fn = list(val = summary_fun)` to summarise duplicates

Die Ausgabe sieht aus wie:

       time       x1        out1    out2 
    2016-04-20  51.50000    <dbl>   <dbl>
2   2016-04-21  56.34615    <dbl>   <dbl>
3   2016-04-22  56.30000    <dbl>   <dbl>
4   2016-04-23  57.85714    <dbl>   <dbl>
5   2016-04-24  58.70968    <dbl>   <dbl>
6   2016-04-25  58.96774    <dbl>   <dbl>

Ich weiß, dass hier das Problem erwähnt wird und um es zu beheben, schlagen sie vor, zusammenfassende Statistiken zu verwenden. Ich habe jedoch Zeitreihendaten und möchte daher keine zusammenfassenden Statistiken verwenden, da jeder Tag einen einzelnen Wert (und nicht mehrere Werte) hat.

Ich weiß, dass das Problem darin besteht, dass die valSpalte Duplikate enthält (dh im obigen Beispiel kommt 7 dreimal vor.

Irgendwelche Vorschläge, wie man pivot_wider und dieses Problem löst?

Daten:

    d <- structure(list(name = c("C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", "C Farolillo", 
"C Farolillo", "C Farolillo", "C Farolillo", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", "Plaza Eliptica", 
"Plaza Eliptica", "Plaza Eliptica"), val = c(7, 3, 7, 13, 7, 
9, 20, 19, 4, 5, 5, 2, 6, 6, 16, 13, 7, 6, 3, 3, 6, 10, 5, 3, 
5, 3, 4, 4, 10, 11, 4, 13, 8, 2, 8, 10, 3, 10, 14, 4, 2, 4, 6, 
6, 8, 8, 3, 3, 13, 10, 13, 32, 25, 31, 34, 26, 33, 35, 43, 22, 
22, 21, 10, 33, 33, 48, 47, 27, 23, 11, 13, 25, 31, 20, 16, 10, 
9, 23, 11, 23, 26, 16, 34, 17, 4, 24, 21, 10, 26, 32, 10, 5, 
9, 19, 14, 27, 27, 10, 8, 28, 32, 25), time = structure(c(16911, 
16912, 16913, 16914, 16915, 16916, 16917, 16918, 16919, 16920, 
16921, 16922, 16923, 16923, 16924, 16925, 16926, 16927, 16928, 
16929, 16930, 16931, 16932, 16933, 16934, 16935, 16936, 16937, 
16938, 16939, 16940, 16941, 16942, 16943, 16944, 16945, 16946, 
16947, 16948, 16949, 16950, 16951, 16952, 16953, 16954, 16955, 
16956, 16957, 16958, 16959, 16960, 16911, 16912, 16913, 16914, 
16915, 16916, 16917, 16918, 16919, 16920, 16921, 16922, 16923, 
16923, 16924, 16925, 16926, 16927, 16928, 16929, 16930, 16931, 
16932, 16933, 16934, 16935, 16936, 16937, 16938, 16939, 16940, 
16941, 16942, 16943, 16944, 16945, 16946, 16947, 16948, 16949, 
16950, 16951, 16952, 16953, 16954, 16955, 16956, 16957, 16958, 
16959, 16960), class = "Date"), x1 = c(51.5, 56.3461538461538, 
56.3, 57.8571428571429, 58.7096774193548, 58.9677419354839, 64.4615384615385, 
61.9310344827586, 60.3214285714286, 59.4137931034483, 59.5806451612903, 
57.3448275862069, 64.0333333333333, 64.0333333333333, 70.15625, 
71.3636363636364, 62.8125, 56.4375, 56.4516129032258, 51.741935483871, 
52.84375, 53.09375, 52.969696969697, 54, 54.3870967741936, 60.3870967741936, 
64.4516129032258, 66.2903225806452, 68.2333333333333, 69.7741935483871, 
70.5806451612903, 73.8275862068966, 72.8181818181818, 64.6764705882353, 
64.4838709677419, 68.7741935483871, 62.1764705882353, 68.969696969697, 
70.1935483870968, 59.6774193548387, 59.9677419354839, 63.125, 
67.5882352941177, 71.4705882352941, 73.8529411764706, 76.1935483870968, 
72.6451612903226, 76.0645161290323, 76.4193548387097, 81.7741935483871, 
85.0645161290323, 51.5, 56.3461538461538, 56.3, 57.8571428571429, 
58.7096774193548, 58.9677419354839, 64.4615384615385, 61.9310344827586, 
60.3214285714286, 59.4137931034483, 59.5806451612903, 57.3448275862069, 
64.0333333333333, 64.0333333333333, 70.15625, 71.3636363636364, 
62.8125, 56.4375, 56.4516129032258, 51.741935483871, 52.84375, 
53.09375, 52.969696969697, 54, 54.3870967741936, 60.3870967741936, 
64.4516129032258, 66.2903225806452, 68.2333333333333, 69.7741935483871, 
70.5806451612903, 73.8275862068966, 72.8181818181818, 64.6764705882353, 
64.4838709677419, 68.7741935483871, 62.1764705882353, 68.969696969697, 
70.1935483870968, 59.6774193548387, 59.9677419354839, 63.125, 
67.5882352941177, 71.4705882352941, 73.8529411764706, 76.1935483870968, 
72.6451612903226, 76.0645161290323, 76.4193548387097, 81.7741935483871, 
85.0645161290323)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-102L))

Antworten:


13

Erstellen Sie für jede eine eindeutige Bezeichnerzeile nameund verwenden Sie diesepivot_wider

library(dplyr)

d %>%
  group_by(name) %>%
  mutate(row = row_number()) %>%
  tidyr::pivot_wider(names_from = name, values_from = val) %>%
  select(-row)

# A tibble: 51 x 4
#   time          x1 `C Farolillo` `Plaza Eliptica`
#   <date>     <dbl>         <dbl>            <dbl>
# 1 2016-04-20  51.5             7               32
# 2 2016-04-21  56.3             3               25
# 3 2016-04-22  56.3             7               31
# 4 2016-04-23  57.9            13               34
# 5 2016-04-24  58.7             7               26
# 6 2016-04-25  59.0             9               33
# 7 2016-04-26  64.5            20               35
# 8 2016-04-27  61.9            19               43
# 9 2016-04-28  60.3             4               22
#10 2016-04-29  59.4             5               22
# … with 41 more rows

2

Typischerweise der Fehler

Warning message:
Values in `val` are not uniquely identified; output will contain list-cols.

wird am häufigsten durch doppelte Zeilen in den Daten (nach Ausschluss der val-Spalte) und nicht durch doppelte Zeilen in der val-Spalte verursacht.

which(duplicated(d))
# [1] 14 65

Die Daten von OP scheinen zwei doppelte Zeilen zu haben, was dieses Problem verursacht. Durch das Entfernen der doppelten Zeilen wird auch der Fehler behoben.

yy <- d %>% distinct() %>% pivot_wider(., names_from = name, values_from = val)
yy
# A tibble: 50 x 4
   time          x1 `C Farolillo` `Plaza Eliptica`
   <date>     <dbl>         <dbl>            <dbl>
 1 2016-04-20  51.5             7               32
 2 2016-04-21  56.3             3               25
 3 2016-04-22  56.3             7               31
 4 2016-04-23  57.9            13               34
 5 2016-04-24  58.7             7               26
 6 2016-04-25  59.0             9               33
 7 2016-04-26  64.5            20               35
 8 2016-04-27  61.9            19               43
 9 2016-04-28  60.3             4               22
10 2016-04-29  59.4             5               22
# ... with 40 more rows

Ich würde die andere Lösung nicht als schnelle / schmutzige Lösung bezeichnen, da es viele Fälle gibt, in denen dies der richtige Weg ist, wenn mehrere Werte pro Zeitpunkt zulässig sind. Da OP jedoch sagte, dass jeder Zeitpunkt nur einen Wert haben sollte, Ihre Lösung löst das Problem doppelter Einträge.
Gilean0709

Einverstanden kann ich sehen, wie nützlich es sein kann, wenn es Zeilen gibt, die sich nur in der Wertespalte unterscheiden.
Ameer

Durch das Entfernen der doppelten Zeilen im Dataset gehen mir Zeitreiheninformationen verloren. Die Daten enthalten zwei verschiedene Zeitreihen C Farolillound Plaza Elipticadie gerade geschieht so den gleichen Wert am selben Tag haben. Dies ist kein echtes Duplikat, nur ein Zufall.
user113156

Der Versuch d[c(13,14),]ergibt die folgenden zwei Zeilen : [1] 13 C Farolillo 6 2016-05-02 64.03333 [2] 14 C Farolillo 6 2016-05-02 64.03333. Dies sind zwei gleiche Beobachtungen an einem Tag für C Farolillo; so sah es für mich wie ein Duplikat aus. Mach ein d[c(64,65),]anderes Paar.
Ameer

1

Das Problem wird durch die Tatsache verursacht, dass die Daten, die Sie weiter verbreiten / schwenken möchten, doppelte Bezeichner haben. Während beide oben genannten Vorschläge, dh das Erstellen einer eindeutigen künstlichen ID aus Zeilennummern mit mutate(row = row_number())oder das Filtern nur von distinctZeilen, es Ihnen ermöglichen, weiter zu schwenken, ändern sie jedoch die Struktur Ihrer Tabelle, was wahrscheinlich zu einem logischen organisatorischen Problem führt Wenn Sie das nächste Mal versuchen, etwas daran anzuschließen.

Es ist viel besser, die id_colsParameterexplizität zu verwenden , um zu sehen, dass Sie nach dem Weitschwenken tatsächlich eindeutig sein müssen, und wenn Sie auf Probleme stoßen, organisieren Sie zuerst die ursprüngliche Tabelle neu. Natürlich können Sie Gründe finden, nach bestimmten Zeilen zu filtern oder eine neue ID hinzuzufügen. Höchstwahrscheinlich möchten Sie die Duplizierung früher in Ihrem Code vermeiden.


Ich habe ähnliche Probleme wie oben, aber keine dieser Lösungen scheint auf mich anwendbar zu sein. Ich habe höchstwahrscheinlich doppelte Werte, da meine Daten zu unterschiedlichen Zeitpunkten unterschiedliche Bewertungen enthalten. Ich habe versucht, id_cols zu verwenden, aber das funktioniert auch nicht.
Con Des

In diesem Fall müssen Ihre Beobachtungen natürlich unter anderem zeitlich eindeutig sein. Die id_cols müssen also alle möglichen Zeitbeobachtungen berücksichtigen. Eine Möglichkeit, dies zu erreichen, besteht darin, <Ihre_ID> _ <Zeit> in einer einzigen ID zu vereinen oder explizit eine eindeutige Zeilen-ID zu erstellen.
Daniel Antal

Ich habe dies versucht, bin mir aber nicht sicher, wie ich es zuerst in Langform machen soll, bevor ich pivot_wider verwende. Aus irgendeinem Grund wurde für zwei Beobachtungen mehrmals dieselbe ID-Nummer vergeben.
Con Des

Damit ich die Duplikate nicht loswerden möchte, möchte ich stattdessen die doppelte ID-Nummer ändern
Con Des

0

Ich denke, die Duplizierung in Ihrem Datensatz ist unbeabsichtigt aufgetreten. Zeile 13/14 sind völlig gleiche Beobachtungen. Korrigieren Sie einfach den Datensatz. Sie können Ihre TT- und JJ-Datensätze anzeigen, um die problematische Beobachtung anzuzeigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.