我正在尝试:= group by一个类型为'integer'的现有列,其中新值的类型为'double',但失败了.
我的场景是根据其他列中的值将表示时间的列变为POSIXct.我可以修改data.table的创建作为一种解决方法,但我仍然对如何实际更改列的类型感兴趣,正如错误消息中所建议的那样.
这是我的问题的简单玩具示例:
db = data.table(id=rep(1:2, each=5), x=1:10, y=runif(10))
db
id x y
1: 1 1 0.47154470
2: 1 2 0.03325867
3: 1 3 0.56784494
4: 1 4 0.47936031
5: 1 5 0.96318208
6: 2 6 0.83257416
7: 2 7 0.10659533
8: 2 8 0.23103810
9: 2 9 0.02900567
10: 2 10 0.38346531
db[, x:=mean(y), by=id]
Error in `[.data.table`(db, , `:=`(x, mean(y)), by = id) :
Type of RHS ('double') must match LHS ('integer'). To check and coerce …Run Code Online (Sandbox Code Playgroud) 这似乎应该很容易,但我找不到答案:(.我正在尝试规范化data_table的每一行,如下所示:
normalize <- function(x) {
s = sum(x)
if (s>0) {
return(x/s)
} else {
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
如何在data.table的每一行上调用此函数并获取规范化的data.table?我可以做一个for循环,但这肯定不是正确的方法,并且apply(data, 1, normalize),据我所知,将我的data.table转换为一个性能很大的矩阵.