我有一个大的data.table值,我需要计算每个县区(CPA)的模式(TRANMOT)的平均旅行时间(TRPDUR)。输出应该是一个表,每个CPA作为一行,然后是非电动模式的平均时间的列和电动模式的平均时间的列。我想出了一个肮脏的方法,用两个独立的data.tables:
来完成它mot_table <- nomot_table <- data.table(trip_dat)
mot_table <- mot_table[!is.na(TRPDUR), list("Motorized Trip Time" = mean(TRPDUR)), keyby = list(CPA, TRANMOT)][TRANMOT == "Motorized"][,TRANMOT:=NULL]
nomot_table <- nomot_table[!is.na(TRPDUR), list("Non-Motorized Trip Time" = mean(TRPDUR)), keyby = list(CPA, TRANMOT)][TRANMOT == "Non-Motorized"][,TRANMOT:=NULL]
这不是一个很好的方式,我相信我可以在一张桌子上做到这一点。当我将表达式(j)列为两列时,我无法弄清楚如何仅计算TRANMOT的某些值的平均值。 This post显示如何对整个data.table(i)进行子集化,就像删除NA一样,但是我希望表达式计算子集数据的平均值,而不是执行两次操作,然后删除行。
谢谢!
答案 0 :(得分:2)
我想你想......
trip_dat[!is.na(TRPDUR),lapply(
c("Motorized","Non-Motorized"),
function(x) mean(TRPDUR[TRANMOT==x])
),by='CPA']
它可能不会很快,但这样的事情应该有用。
答案 1 :(得分:0)
我相信data.table
很快会有一些重塑功能,比如施法和融化。
使用reshape2
,就像这样。它不使用任何data.table
魔法,因此对于非常大的对象,这可能会失败。之后你必须更改列名。
new <- mot_table[!is.na(TRPDUR),
mean(TRPDUR),
keyby = list(CPA, TRANMOT)
]
new <- dcast(TRANMOT ~ CPA, data = new, value.var = V1)
纯粹使用data.table
,也许就像这样内联。之后你必须更改列名。
new <- mot_table[!is.na(TRPDUR),
mean(TRPDUR),
keyby = list(CPA, TRANMOT)
][, setNames(lapply(unique(TRANMOT),
function(x) {
V1[which(TRANMOT == x)]
}, paste0("Motorized: ", unique(TRANMOT))),
by = CPA
]