1 Вопрос: Как изменить имена столбцов с помощью dcast?

вопрос создан в Wed, May 8, 2019 12:00 AM

Я преобразую свои данные из длинных в широкие. Часть данных являются датами. Моя проблема в том, что я хотел бы иметь другие имена. Он сформирован как, например, variable_1-1, и я хочу 1-1_variable.

ДФ:

    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

Я пробовал dcast из data.table:

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

Которые дают мне следующий результат:

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"       

С этим результатом все в порядке, но я предпочитаю, чтобы имена столбцов формировались как specimen_isolate_no_variable, например, 1-1_alarmniveau.

Чтобы добиться этого, я попробовал

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) 

Но оба варианта испортили мои даты, и я не знаю, как это исправить.

 #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"

Итак, мой вопрос: кто-нибудь, как изменить формирование имен с помощью dcast?

    
2
  1. Я не думаю, что вы хотите изменить форму, используя dcast напрямую (хотя вы не указали, какую именно форму вы хотите использовать для имен - возможно, Аргумент sep полезен? Хотя я понял, что нет ... ... Вы можете попробовать либо (1) перезаписать specimen_isolate_no перед приведением, либо (2) использовать setnames & немного grep/gsub магии, которую нужно убрать потом
    2019-05-08 16: 15: 21Z
  2. @ MichaelChirico: Я не уверен, что понимаю. Я хотел бы 1-1_variable вместо variable_1-1.
    2019-05-08 16: 33: 06Z
  3. На данный момент, к сожалению, для этого нет функциональности. Более раннее обсуждение здесь: github.com/Rdatatable/data.table/issues/1951 @MichaelChirico
    2019-05-08 16: 50: 01Z
  4. Я не думаю, что в настоящее время это возможно сделать напрямую с помощью dcast. Вы можете использовать такую ​​функцию, как setnames (), чтобы изменить имена столбцов после использования dcast (). Вы должны оставить комментарий к data.table GitHub, возможно, они добавят эту функцию в будущем обновлении.
    2019-05-08 17: 22: 27Z
  5. Хорошо, спасибо всем! :)
    2019-05-08 18: 15: 05Z
1 ответ                              1                         

Как уже упоминал Фрэнк, для этой ... дополнительной заметки имеется выдающийся запрос: пожалуйста, добавьте реакции на FR, которые вы хотите, мы используем это в некоторой степени, чтобы ускорить разработку:

https://github.com/Rdatatable/data.table/issues/3189 р>

А пока вы можете просто использовать setnames и некоторые регулярные выражения для этого:

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
источник размещен Вот