vấn đề p Pivot_wider Giá trị trong các giá trị `không được xác định duy nhất; đầu ra sẽ chứa danh sách-cols


8

Dữ liệu của tôi trông như thế này:

# 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

Tôi đang cố gắng sử dụng pivot_widerchức năng để mở rộng dữ liệu dựa trên namecột. Tôi sử dụng mã sau đây:

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

Cung cấp cho tôi thông báo cảnh báo sau:

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

Đầu ra trông như sau:

       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>

Tôi biết rằng ở đây đề cập đến vấn đề và để giải quyết vấn đề họ đề nghị sử dụng số liệu thống kê tóm tắt. Tuy nhiên, tôi có dữ liệu chuỗi thời gian và do đó không muốn sử dụng số liệu thống kê tóm tắt vì mỗi ngày có một giá trị (và không có nhiều giá trị).

Tôi biết vấn đề là do valcột có trùng lặp (tức là trong ví dụ trên 7 xảy ra 3 lần.

Bạn có đề xuất nào về cách p Pivot_wider và khắc phục vấn đề này không?

Dữ liệu:

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

Câu trả lời:


13

Tạo một hàng định danh duy nhất cho mỗi namevà sau đó sử dụngpivot_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

Điển hình là lỗi

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

thường được gây ra bởi các hàng trùng lặp trong dữ liệu (sau khi loại trừ cột val) và không trùng lặp trong cột val.

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

Dữ liệu của OP dường như có hai hàng trùng lặp gây ra vấn đề này. Loại bỏ các hàng trùng lặp cũng được loại bỏ lỗi.

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

Tôi sẽ không gọi giải pháp khác là sửa chữa nhanh / bẩn, vì có nhiều trường hợp vaild trong đó đây là cách làm đúng nếu nhiều giá trị cho mỗi mốc thời gian được cho phép, nhưng vì OP nói rằng mỗi mốc thời gian chỉ nên có một giá trị, giải pháp của bạn giải quyết vấn đề của các mục trùng lặp.
Gilean0709

Đồng ý, tôi có thể thấy nó hữu ích như thế nào nếu có các hàng chỉ khác nhau trong cột giá trị.
Ameer

Xóa các hàng trùng lặp trong tập dữ liệu sẽ khiến tôi mất thông tin chuỗi thời gian. Dữ liệu chứa hai chuỗi thời gian khác nhau C FarolilloPlaza Elipticađiều đó xảy ra có cùng giá trị trong cùng một ngày. Đây không phải là một bản sao thực sự, chỉ là một sự trùng hợp ngẫu nhiên.
dùng113156

Cố gắng d[c(13,14),]đưa ra hai hàng sau : [1] 13 C Farolillo 6 2016-05-02 64.03333 [2] 14 C Farolillo 6 2016-05-02 64.03333. Đây là hai quan sát tương tự trong một ngày cho C Farolillo; vì vậy nó trông giống như một bản sao đối với tôi.d[c(64,65),] Cho một cặp khác.
Ameer

1

Vấn đề được gây ra bởi thực tế là dữ liệu mà bạn muốn trải rộng / trục rộng hơn có các định danh trùng lặp. Trong khi cả hai đề xuất ở trên, tức là tạo id nhân tạo duy nhất từ ​​số hàng với mutate(row = row_number())hoặc chỉ lọcdistinct các hàng sẽ cho phép bạn xoay vòng rộng hơn, nhưng chúng thay đổi cấu trúc bảng của bạn, có khả năng xảy ra sự cố tổ chức, logic. lần sau bạn cố gắng tham gia bất cứ điều gì với nó.

Đó là một cách thực hành tốt hơn nhiều để sử dụng id_colsthông số khám phá, để thấy rằng bạn thực sự muốn phải là duy nhất sau khi mở rộng và nếu bạn gặp vấn đề, trước tiên hãy tổ chức lại bảng gốc. Tất nhiên, bạn có thể tìm thấy lý do để lọc các hàng riêng biệt hoặc thêm ID mới, rất có thể bạn sẽ muốn tránh sự trùng lặp trước đó trong mã của mình.


Tôi đang gặp vấn đề tương tự như những vấn đề trên nhưng không có giải pháp nào trong số này có thể áp dụng cho tôi. Tôi có các giá trị trùng lặp rất có thể vì dữ liệu của tôi liên quan đến các xếp hạng khác nhau tại các thời điểm khác nhau. Tôi đã thử sử dụng id_cols nhưng nó cũng không hoạt động.
Con Des

Trong trường hợp này rõ ràng các quan sát của bạn phải là duy nhất, trong thời gian gần đây. Vì vậy, id_cols phải tính đến tất cả các quan sát thời gian có thể. Một cách để đạt được điều này là hợp nhất <your_id> _ <time> thành một ID duy nhất hoặc tạo rõ ràng một id hàng duy nhất.
Daniel Antal

Tôi đã thử điều này nhưng không chắc chắn làm thế nào để thực hiện nó ở dạng dài trước khi sử dụng p Pivot_wider. Vì một số lý do, cùng một số id được gán cho hai lần quan sát một vài lần.
Con Des

Vì vậy, tôi không muốn loại bỏ các bản sao, thay vào đó, tôi muốn thay đổi số id trùng lặp
Con Des

0

Tôi đoán, sự trùng lặp trong tập dữ liệu của bạn đã vô tình xảy ra. dòng13 / 14 là những quan sát hoàn toàn giống nhau. Chỉ cần sửa dữ liệu. bạn có thể Xem bộ dữ liệu d và yy của bạn để xem quan sát có vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.