1 Câu hỏi: Làm cách nào để thay đổi tên cột bằng dcast?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang chuyển đổi dữ liệu của mình từ dài sang rộng. Một phần của dữ liệu là ngày. Vấn đề của tôi là tôi muốn có các tên khác. Nó được hình thành như ví dụ biến_1-1 và tôi muốn 1-1_variable.

df:

    SN specimen_isolate_no isolaat materiaal_lokatie alarmniveau afnamedatum
 1:  2                 1-1  STAPEP Bloedkweek  Bloed       0      2017-04-30
 2:  3                 1-1  KLEBOX      Bloedkweek         0      2018-12-30
 3:  3                 2-1  KLEBOX      Bloedkweek         0      2018-12-31

Tôi đã thử dcast từ data.table:

setDT(df) 
df.wide <- dcast(df, SN ~ specimen_isolate_no, value.var = c("materiaal_lokatie","afnamedatum", "isolaat", "alarmniveau" ))

Cho tôi kết quả sau:

colnames: 
[1] "SN"                    "materiaal_lokatie_1-1" "materiaal_lokatie_2-1" 
 "afnamedatum_1-1"            "afnamedatum_2-1"        "isolaat_1-1"          
      "isolaat_2-1"                  "alarmniveau_1-1"    "alarmniveau_2-1"       

Kết quả này là ổn, nhưng tôi thay vào đó là các tên được hình thành như specample_isolate_no_variable, ví dụ 1-1_alarmniveau.

Để đạt được điều này, tôi đã thử

molten <- melt(df, id.vars = c("SN", "specimen_isolate_no"))
dfmolton <- dcast(molten, SN ~ specimen_isolate_no + variable)

#and 

 df %>% 
     gather(key, value, -SN, -specimen_isolate_no) %>%  
     unite(new.col, c(specimen_isolate_no,key )) %>%   
     spread(new.col, value) 

Nhưng cả hai tùy chọn đều làm xáo trộn ngày của tôi và tôi không biết cách khắc phục điều đó.

 #colnames:
 [1] "SN"                    "1-1_isolaat"           "1-1_materiaal_lokatie" "1-1_alarmniveau"       "1-1_afnamedatum"       "2-1_isolaat"           "2-1_materiaal_lokatie" "2-1_alarmniveau"      "2-1_afnamedatum"   

dfmolten$`1-1_afnamedatum`
[1] "17286" "17895"

2
  1. Tôi không nghĩ rằng bạn muốn thay đổi hình thức bằng cách sử dụng trực tiếp dcast (mặc dù bạn chưa nêu chính xác hình thức bạn muốn đặt tên - có lẽ Đối số sep có hữu ích không? Mặc dù tôi không thu thập được) ... Bạn có thể thử (1) ghi đè specimen_isolate_no trước khi truyền hoặc (2) sử dụng setnames & một số grep/gsub để dọn dẹp sau đó
    2019-05-08 16: 15: 21Z
  2. @ MichaelChirico: Tôi không chắc là mình hiểu. Tôi muốn 1-1_variable thay vì biến_1-1.
    2019-05-08 16: 33: 06Z
  3. Không có chức năng cho nó ngay bây giờ, thật không may. Một cuộc thảo luận trước đây có tại đây: github.com/Rdatitable/data.table/issues/1951 @MichaelChirico
    2019-05-08 16: 50: 01Z
  4. Tôi không nghĩ rằng hiện tại có thể thực hiện điều này trực tiếp với dcast. Bạn có thể sử dụng một hàm như setnames () để thay đổi tên cột sau khi sử dụng dcast (). Bạn nên bỏ một nhận xét về GitHub data.table, có thể họ sẽ thêm tính năng này trong bản cập nhật trong tương lai.
    2019-05-08 17: 22: 27Z
  5. Ok, cảm ơn tất cả các bạn! :)
    2019-05-08 18: 15: 05Z
1 Câu trả lời                              1                         

Như Frank đã đề cập, có một yêu cầu tính năng nổi bật cho ... lưu ý phụ này: vui lòng thêm phản ứng vào FR bạn muốn, chúng tôi sử dụng điều này trong một chừng mực nào đó để điều khiển thời gian phát triển:

https://github.com/Rdatitable/data.table/issues/3189

Trong thời gian này, bạn chỉ có thể sử dụng setnames và một số biểu thức chính quy để thực hiện việc này:

old = grep('SN', names(df.wide), value = TRUE, invert = TRUE, fixed = TRUE)
new = sapply(strsplit(old, '_', fixed = TRUE), function(x) paste(rev(x), collapse = '_'))
setnames(df.wide, old, new)
    
2
2019-05-09 04: 34: 16Z
nguồn đặt đây