Problema pivot_wider “Os valores em` values_from` não são identificados exclusivamente; a saída conterá list-cols "

8

Meus dados são assim:

# 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

Estou tentando usar a pivot_widerfunção para expandir os dados com base na namecoluna. Eu uso o seguinte código:

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

O que me dá a seguinte mensagem de aviso:

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

A saída se parece com:

       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>

Eu sei que aqui menciona o problema e, para resolvê-lo, eles sugerem o uso de estatísticas resumidas. No entanto, tenho dados de séries temporais e, portanto, não quero usar estatísticas resumidas, pois cada dia tem um valor único (e não vários valores).

Eu sei que o problema é porque a valcoluna tem duplicatas (ou seja, no exemplo acima, 7 ocorre 3 vezes.

Alguma sugestão sobre como pivot_wider e superar esse problema?

Dados:

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

Respostas:

13

Crie uma linha de identificador exclusiva para cada um namee 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
Ronak Shah
fonte
2

Normalmente o erro

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

geralmente é causado por linhas duplicadas nos dados (após excluir a coluna val) e não por duplicatas na coluna val.

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

Os dados do OP parecem ter duas linhas duplicadas, o que está causando esse problema. A remoção das linhas duplicadas também elimina o erro.

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
Ameer
fonte
Eu não chamaria a outra solução de correção rápida / suja, pois há muitos casos válidos em que essa é a maneira certa de fazer isso se vários valores por ponto de tempo forem permitidos, mas como o OP disse que cada ponto de tempo deveria ter apenas um valor, sua solução resolve o problema de entradas duplicadas.
Gilean0709 15/02
Concordo, posso ver como isso poderia ser útil se houver linhas que diferem apenas na coluna de valor.
Ameer 15/02
A remoção das linhas duplicadas no conjunto de dados fará com que eu perca informações sobre séries temporais. Os dados contêm duas séries temporais diferentes C Farolilloe Plaza Elipticaque têm o mesmo valor no mesmo dia. Esta não é uma duplicata verdadeira, apenas uma coincidência.
user113156 15/02
Tentando d[c(13,14),]dá as duas linhas seguintes: [1] 13 C Farolillo 6 2016-05-02 64.03333 [2] 14 C Farolillo 6 2016-05-02 64.03333. São duas mesmas observações em um dia para C Farolillo; então pareceu duplicado para mim d[c(64,65),]. Faça outro par.
Ameer 16/02
1

O problema é causado pelo fato de que os dados que você deseja espalhar / dinamizar mais têm identificadores duplicados. Enquanto as duas sugestões acima, por exemplo, criar um ID artificial exclusivo a partir dos números de linha com mutate(row = row_number())ou filtrar apenasdistinct linhas, permitirão que você gire mais, mas elas alteram a estrutura da sua tabela, o que provavelmente terá um problema lógico e organizacional que será lançado. da próxima vez que você tentar juntar algo a ele.

É uma prática muito melhor usar o id_colsparâmetro explicitamente, para ver se você realmente precisa ser único depois de girar amplamente e, se estiver com problemas, reorganize a tabela original primeiro. Obviamente, você pode encontrar motivos para filtrar linhas distintas ou adicionar um novo ID, provavelmente você desejará evitar a duplicação anteriormente no seu código.

Daniel Antal
fonte
Estou tendo problemas semelhantes aos acima, mas nenhuma dessas soluções me parece aplicável. Provavelmente, tenho valores duplicados porque meus dados envolvem classificações diferentes em diferentes momentos. Eu tentei usar id_cols, mas isso também não funciona.
Con Des
Nesse caso, obviamente, suas observações devem ser únicas, entre outras coisas, no tempo. Portanto, os id_cols devem levar em consideração todas as observações de tempo possíveis. Uma maneira de conseguir isso é unir <your_id> _ <time> em um único ID ou criar explicitamente um ID de linha exclusivo.
Daniel Antal
Eu tentei isso, mas não sei como fazê-lo no formato longo antes de usar o pivot_wider. Por alguma razão, o mesmo número de identificação foi atribuído para duas observações algumas vezes.
Con Des
Portanto, não quero me livrar das duplicatas. Em vez disso, gostaria de alterar o número de identificação duplicado
Con Des
0

Eu acho que a duplicação no seu conjunto de dados ocorreu sem querer. line13 / 14 são totalmente as mesmas observações. Apenas corrija o conjunto de dados. você pode exibir seus conjuntos de dados d e aa para ver a observação problemática.

Todos
fonte