【发布时间】:2016-02-06 05:02:17
【问题描述】:
我正在尝试将 data.table 聚合到每个 ID 1 行。
假设第一列代表ID,最后一列是感兴趣的因素:
mydt <- data.table(matrix(c(1,2,"Level 1", 1,12,"Level 0", 1,12,"Level 0", 2,12,"Level 3", 2,12,"Level 2"), nrow = 5, ncol = 3, byrow = TRUE))
mydt
V1 V2 V3
1: 1 2 Level 1
2: 1 12 Level 0
3: 1 12 Level 0
4: 2 12 Level 3
5: 2 12 Level 2
我对如何聚合因子有非直观的规则:
- 如果
Level 1存在于任何 ID 行,则聚合行应具有该 ID 的Level 1 - 如果不存在,则如果该 ID 存在
Level 2,则使用它 - 如果不存在,则
Level 3如果存在 - 如果不是,那么
Level 0
实际的data.table 非常大,实际因子水平没有数字分量,它们只是字符串。该脚本将每天至少运行一次,因此我试图避免使用循环进行缓慢的预处理。
想要的结果如下所示:
V1 V2 V3
1: 1 8.67 Level 1
2: 2 12 Level 2
但是我找不到合适的聚合函数...
mydt[,.(V2 = mean(V2, na.rm = T), V3 = if("Level 1") "Level 1" else if("idk help me out?")), by = "V1"]
【问题讨论】:
-
我假设您的数据最初并未存储为
character(您使用mean(V2)而没有as.numeric表明是这种情况)?使用matrix声明您的示例会在混合时删除非character类型。最好按列指定,例如mydt <- data.table(V1 = rep(1:2, c(3,2)), V2 = rep(c(2, 12), c(1, 4)), V3 = factor(paste0("Level", c(1,0,0,3,2)))) -
是的,Michael 说过:不要将矩阵用于混合数据类型(在这种情况下为字符串和数字)。你也可以
mydt = rbindlist(list( list(1,2,"Level 0"), list(1,12,"Level 0"), list(1,12,"Level 0"), list(2,12,"Level 3"), list(2,12,"Level 2") ))
标签: r data.table