【发布时间】:2015-08-20 14:46:39
【问题描述】:
仍在学习这个很棒的包 data.table。我正在处理以下 data.table:
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") 将根据列sex 和agef 的值生成它们的名称和值。我能够以一种简单的方式做到:
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”开头的列运行相同的代码。我将编辑代码。
-
OP 在同一列中阅读了哈德利关于混合性别和年龄的看法vita.had.co.nz/papers/tidy-data.pdf
-
我不认为完全禁止混合分类变量,但我也会看看。 @nsDataSci 我会建议一个不同的标题。您的列名与表中的数据无关,而是由您自己选择的切点确定。 “在 data.table 中创建复合/交互虚拟变量”怎么样?这个问题有一个更简单的版本,标题如下:stackoverflow.com/questions/18881073/…
-
@plafort :谢谢,我会看一下......但是当你有基于混合的次要价值时,你无法避免这种情况,比如该乐队的相对系数。
-
@frank : 是的,绝对有道理.. 我会更改标题以使其更清晰.. 谢谢
标签: r data.table