Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Định hình lại bảng trong MySQL hoặc R

Trong cơ sở R, hàm được sử dụng sẽ là reshape và bạn sẽ chuyển đổi dữ liệu của mình từ "dài" thành "rộng".

reshape(mydf, direction = "wide", idvar="perid", timevar="date")
#   perid rating.2005 rating.2006 rating.2007 rating.2008 rating.2009 rating.2010 rating.2011
# 1 10001          RD          GN          GD        <NA>        <NA>        <NA>        <NA>
# 4 10002        <NA>        <NA>        <NA>          GD          YW          GN          GN
# 8 10003          GD          GN          YW        <NA>        <NA>        <NA>        <NA>

Ngoài ra, bạn có thể xem dcast từ gói "reshape2" và thử:

library(reshape2)
dcast(mydf, perid ~ date, value.var="rating")
#   perid 2005 2006 2007 2008 2009 2010 2011
# 1 10001   RD   GN   GD <NA> <NA> <NA> <NA>
# 2 10002 <NA> <NA> <NA>   GD   YW   GN   GN
# 3 10003   GD   GN   YW <NA> <NA> <NA> <NA>

Để có tốc độ tốt hơn, hãy chuyển đổi data.frame của bạn tới một data.table và sử dụng dcast.data.table thay vào đó.

Thư viện
library(reshape2)
library(data.table)
DT <- data.table(mydf)
dcast.data.table(DT, perid ~ date, value.var = "rating")
#    perid 2005 2006 2007 2008 2009 2010 2011
# 1: 10001   RD   GN   GD   NA   NA   NA   NA
# 2: 10002   NA   NA   NA   GD   YW   GN   GN
# 3: 10003   GD   GN   YW   NA   NA   NA   NA

Từ nhận xét của bạn, có vẻ như bạn có các giá trị trùng lặp giữa các kết hợp của cột 1 và 2, có nghĩa là theo mặc định, dcast sẽ sử dụng length như chức năng tổng hợp của nó.

Để vượt qua điều này, bạn cần tạo một cột ID phụ (hoặc "thời gian"), có thể được thực hiện như thế này.

Đầu tiên, một số dữ liệu mẫu. Lưu ý sự kết hợp trùng lặp của hai cột đầu tiên trong hàng 1 và hàng 2.

mydf <- data.frame(
  period = c(10001, 10001, 10002, 10002, 10003, 10003, 10001, 10001),
  date = c(2005, 2005, 2006, 2007, 2005, 2006, 2006, 2007),
  rating = c("RD", "GN", "GD", "GD", "YW", "GN", "GD", "YN"))
mydf
#   period date rating
# 1  10001 2005     RD
# 2  10001 2005     GN
# 3  10002 2006     GD
# 4  10002 2007     GD
# 5  10003 2005     YW
# 6  10003 2006     GN
# 7  10001 2006     GD
# 8  10001 2007     YN

Khi bạn thử dcast , nó chỉ "đếm" số dưới mỗi kết hợp.

## Not what you want
dcast(mydf, period ~ date, value.var="rating")
# Aggregation function missing: defaulting to length
#   period 2005 2006 2007
# 1  10001    2    1    1
# 2  10002    0    1    1
# 3  10003    1    1    0

Quyết định hàng trùng lặp nào sẽ bị loại bỏ hoặc nếu tất cả dữ liệu thuộc về tập dữ liệu của bạn, hãy thêm biến "thời gian", như sau:

mydf$time <- ave(1:nrow(mydf), mydf$period, mydf$date, FUN = seq_along)
mydf
#   period date rating time
# 1  10001 2005     RD    1
# 2  10001 2005     GN    2
# 3  10002 2006     GD    1
# 4  10002 2007     GD    1
# 5  10003 2005     YW    1
# 6  10003 2006     GN    1
# 7  10001 2006     GD    1
# 8  10001 2007     YN    1

Bây giờ, dcast sẽ hoạt động tốt. Đây là phiên bản bán dài ...

dcast(mydf, period + time ~ date, value.var="rating")
#   period time 2005 2006 2007
# 1  10001    1   RD   GD   YN
# 2  10001    2   GN <NA> <NA>
# 3  10002    1 <NA>   GD   GD
# 4  10003    1   YW   GN <NA>

... và phiên bản bán rộng.

dcast(mydf, period ~ date + time, value.var="rating")
#   period 2005_1 2005_2 2006_1 2007_1
# 1  10001     RD     GN     GD     YN
# 2  10002   <NA>   <NA>     GD     GD
# 3  10003     YW   <NA>     GN   <NA>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự cố mã hóa MySQL - Các kết quả khác nhau từ windows đến linux

  2. JDBC, MySQL:nhận các bit vào cột BIT (M! =1)

  3. Thả khóa duy nhất muli-column mà không làm rơi khóa ngoại?

  4. Làm thế nào để tránh đúng điều kiện Cuộc đua Mysql

  5. Cách xóa bản ghi cuối cùng (với điều kiện) khỏi một bảng trong MySql