problema pivot_wider “Los valores en` values_from` no se identifican de forma exclusiva; la salida contendrá list-cols "


8

Mis datos se ven así:

# 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

Estoy tratando de usar la pivot_widerfunción para expandir los datos en función de la namecolumna. Yo uso el siguiente código:

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

Lo que me da el siguiente mensaje de advertencia:

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

El resultado se ve así:

       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>

Sé que aquí se menciona el problema y para resolverlo sugieren usar estadísticas resumidas. Sin embargo, tengo datos de series de tiempo y, por lo tanto, no quiero usar estadísticas de resumen, ya que cada día tiene un valor único (y no valores múltiples).

Sé que el problema se debe a que la valcolumna tiene duplicados (es decir, en el ejemplo anterior 7 ocurre 3 veces.

¿Alguna sugerencia sobre cómo pivot_wider y superar este problema?

Datos:

    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))

Respuestas:


13

Cree una fila de identificador único para cada uno namey luego usepivot_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

Típicamente el error

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

La mayoría de las veces es causada por filas duplicadas en los datos (después de excluir la columna val), y no por duplicados en la columna val.

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

Los datos de OP parecen tener dos filas duplicadas, lo que está causando este problema. Eliminar las filas duplicadas también elimina el error.

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

No llamaría a la otra solución una solución rápida / sucia, ya que hay muchos casos vastos en los que esta es la forma correcta de hacerlo si se permiten múltiples valores por punto de tiempo, pero como OP dijo que cada punto de tiempo solo debería tener un valor, Su solución resuelve el problema de las entradas duplicadas.
Gilean0709

De acuerdo, puedo ver cómo podría ser útil si hay filas que difieren solo en la columna de valor.
Ameer

Eliminar las filas duplicadas en el conjunto de datos hará que pierda información de series de tiempo. Los datos contienen dos series de tiempo diferentes C Farolilloy Plaza Elipticaque tienen el mismo valor el mismo día. Este no es un verdadero duplicado, solo una coincidencia.
user113156

Tratando d[c(13,14),]da las dos filas siguientes: [1] 13 C Farolillo 6 2016-05-02 64.03333 [2] 14 C Farolillo 6 2016-05-02 64.03333. Estas son dos mismas observaciones en un día para C Farolillo; así que me pareció un duplicado. Haz d[c(64,65),]por otro par.
Ameer

1

El problema se debe al hecho de que los datos que desea extender / pivotar más ancho tienen identificadores duplicados. Si bien las dos sugerencias anteriores, es decir, crear una identificación artificial única a partir de los números de fila mutate(row = row_number())o filtrar solo distinctfilas le permitirán pivotar más, pero cambian la estructura de su tabla, lo que probablemente tenga un problema lógico y organizacional que saldrá la próxima vez que intentes unirle algo.

Es una práctica mucho mejor usar la id_colsexplicidad del parámetro, para ver que realmente desea ser único después de pivotar ampliamente, y si tiene problemas, reorganice primero la tabla original. Por supuesto, puede encontrar una razón para filtrar en filas distintas o agregar una nueva ID, lo más probable es que desee evitar la duplicación anterior en su código.


Tengo problemas similares a los anteriores, pero ninguna de estas soluciones me parece aplicable. Lo más probable es que tenga valores duplicados porque mis datos involucran diferentes clasificaciones en diferentes puntos de tiempo. Intenté usar id_cols pero esto tampoco funciona.
Con Des

En este caso, obviamente, sus observaciones deben ser únicas, entre otras cosas, en el tiempo. Por lo tanto, id_cols debe tener en cuenta todas las observaciones de tiempo posibles. Una forma de lograr esto es unir <your_id> _ <time> en una sola ID, o crear explícitamente una ID de fila única.
Daniel Antal

He intentado esto, pero no estoy seguro de cómo hacerlo primero antes de usar pivot_wider. Por alguna razón, se asignó el mismo número de identificación para dos observaciones un par de veces.
Con Des

Así que no quiero deshacerme de los duplicados, en cambio, me gustaría cambiar el número de identificación duplicado
Con Des

0

Supongo que la duplicación en su conjunto de datos ha ocurrido involuntariamente. la línea 13/14 son observaciones totalmente iguales. Simplemente corrija el conjunto de datos. puede ver sus conjuntos de datos d y yy para ver la observación problemática.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.