Все еще изучайте эту потрясающую таблицу данных package.table. Я работаю над следующим data.table:Создание составных/взаимодействующих фиктивных переменных в data.table в 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
Я пытаюсь создать новые столбцы (age_gender полос), как ("F0_34", "F35_44", "F45_54", "F55_59" ..... ... «F95_GT») и («M0_34», «M35_44», «M45_54», «M55_59» ........ «M95_GT») в зависимости от значения пола столбца и возраста, их имена и значение будут быть сгенерированным. Я могу сделать простым способом:
demo <- demo[ ,F0_34:= {ifelse((sex==2) & (agef >= 0) & (agef <= 34), 1, 0)}]
Но я искал элегантное решение для этого, и я попытался передать age_band в виде списка в lapply функции следующим образом:
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]
Я получаю желаемый результат:
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
, но с некоторыми предупреждениями:
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.
, который я не могу понять, может кто-то указать, что я делаю неправильно?
Я буду запускать тот же код для столбцов, начинающихся с «M». Я отредактирую код. – nsDataSci
OP читать Хэдли взять на себя смешение пола и возраста в той же колонке http://vita.had.co.nz/papers/tidy-data.pdf –
Я не думаю, что смешивание категорических варов должно быть полностью запрещено, но я Я также посмотрю на это. @nsDataSci Я бы предложил другое название. Имена столбцов не зависят от данных в таблице и вместо них определяются точками вы сами выбрали. Как насчет «Создание составных/взаимодействующих фиктивных переменных в data.table»? Существует более простая версия этого вопроса с таким заголовком: http://stackoverflow.com/questions/18881073/creating-dummy-variables-in-r-data-table – Frank