Как изменить имена столбцов с помощью dcast? - PullRequest
2 голосов
/ 08 мая 2019

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

Я пробовал 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?

1 Ответ

2 голосов
/ 09 мая 2019

Как упомянул Фрэнк, для этого ... есть замечательный запрос на добавление функций: пожалуйста, добавьте реакции на 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...