在R中的data.table中执行:=按组时,如何更改目标列的类型?

在R中的data.table中执行:=按组时,如何更改目标列的类型?,r,types,data.table,R,Types,Data.table,我正在尝试对“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.47154

我正在尝试对“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 would impact performance too much for the fastest cases. Either change the type of the target column, or coerce the RHS of := yourself (e.g. by using 1L instead of 1)

我们可以将“x”列的类转换为“numeric”,然后再将“mean(y)”指定给“x”,因为“x”的类是“integer”。如果我们用任何其他数值变量(包括“x”)的
平均值替换“x”,这可能很有用

或指定给新列,然后更改列名

setnames(db[, x1:= mean(y),by=id][,x:=NULL],'x1', 'x')
或者我们可以将“x”指定给“NULL”,然后创建“x”作为“y”的
平均值(@David Arenburg的建议)


喜欢快速反应!完全忘记了改变。。。关于第二个建议,在集合名中使用“x1”可能更整洁?也就是说,集合名(db[,x1:=平均值(y),by=id][,x:=NULL],'x1','x')哈哈,我只需要再等几分钟;-)@戴维登堡谢谢,这很有道理。我将
x
转换为数值,以防OP想要将
x
更改为该变量本身的平均值。我没有想过使用
db[,x:=NULL][,x:=mean(y),by=id]
,@hallvig是的,它更整洁。我更新了帖子。
setnames(db[, x1:= mean(y),by=id][,x:=NULL],'x1', 'x')
db[, x:=NULL][, x:= mean(y), by= id][]