Ancora imparando questo fantastico pacchetto data.table. Sto lavorando sul seguente data.table:Creazione di variabili fittizie composte/interagite in data.table in R
demo <- data.table(id = c(1, 2, 3, 4, 5, 6), sex = c(1, 2, 1, 2, 2, 2), agef = c(43, 53, 63, 73, 83, 103))
demo:
id sex agef
1 1 43
2 2 53
3 1 63
4 2 73
5 2 83
6 2 103
Sto cercando di generare nuove colonne (age_gender band) come ("F0_34", "F35_44", "F45_54", "F55_59" ..... ... "F95_GT") e ("M0_34", "M35_44", "M45_54", "M55_59" ........ "M95_GT") in base al valore della colonna sesso e età, i loro nomi e il loro valore essere generato. Sono in grado di fare in modo semplice:
demo <- demo[ ,F0_34:= {ifelse((sex==2) & (agef >= 0) & (agef <= 34), 1, 0)}]
Ma ero alla ricerca di una soluzione elegante per questo e ho cercato di passare age_band come una lista in funzione di lapply, come segue:
i <- list("0_34","35_44","45_54","55_59","60_64","65_69","70_74","75_79","80_84","85_89","90_94","95_GT")
demo[, paste0("F", i) := lapply(i, function(i)lapply(.SD, function(x){
l1 <- unlist(str_split(i, "_"))
if(l1[2] == "GT") l1[2] <- 1000
l1 <- as.numeric(l1)
score <- ifelse((sex==2) & (agef >= l1[1]) & (agef <= l1[2]), 1, 0)
return(score)
})), .SDcols = c("sex", "agef"), by = id]
demo[, paste0("M", i) := lapply(i, function(i)lapply(.SD, function(x){
l1 <- unlist(str_split(i, "_"))
if(l1[2] == "GT") l1[2] <- 1000
l1 <- as.numeric(l1)
score <- ifelse((sex==1) & (agef >= l1[1]) & (agef <= l1[2]), 1, 0)
return(score)
})), .SDcols = c("sex", "agef"), by = id]
sto ottenendo il risultato desiderato:
id sex agef F0_34 F35_44 F45_54 F55_59 F60_64 F65_69 F70_74 F75_79 F80_84 F85_89 F90_94 F95_GT M0_34 M35_44 M45_54 M55_59 M60_64 M65_69 M70_74 M75_79 M80_84 M85_89 M90_94 M95_GT
1 1 43 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
2 2 53 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 1 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
4 2 73 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 2 83 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
6 2 103 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
ma con alcune avvertenze:
Warning messages:
1: In `[.data.table`(demographic1, , `:=`(paste0("F", i), ... :
RHS 1 is length 2 (greater than the size (1) of group 1). The last 1 element(s) will be discarded.
che non sono in grado di capire, qualcuno potrebbe indicare cosa sto facendo male?
eseguirò lo stesso codice per le colonne che iniziano con "M". Modificherò il codice. – nsDataSci
OP leggere Hadley su come mescolare sesso ed età nella stessa colonna http://vita.had.co.nz/papers/tidy-data.pdf –
Non penso che mescolare le vars categoriali sia completamente proibito, ma io daremo un'occhiata anche a questo. @nsDataSci Suggerirei un titolo diverso. I nomi delle colonne sono indipendenti dai dati nella tabella e determinati dai punti di divisione scelti dall'utente. Che ne dite di "Creazione di variabili fittizie composte/interagite in data.table"? C'è una versione più semplice di questa domanda con un titolo del genere: http://stackoverflow.com/questions/18881073/creating-dummy-variables-in-r-data-table – Frank