r - 在 R 中执行 := by group in a data. 表时如何更改目标列的类型?

标签 r types data.table

我正在尝试对现有的“整数”类型的列执行 := by group,其中新值的类型为“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)

最佳答案

我们可以在将 'mean(y)' 分配给 'x' 之前将 'x' 列的类转换为 'numeric',因为 'x' 的类是 'integer'。如果我们用 mean 替换“x”,这可能很有用任何其他数字变量(包括“x”)。

db[, x:= as.numeric(x)][, x:= mean(y), by=id][]

或者分配到一个新列,然后更改列名
setnames(db[, x1:= mean(y),by=id][,x:=NULL],'x1', 'x')

或者我们可以将 'x' 分配给 'NULL' 然后创建 'x' 作为 mean 'y'(@David Arenburg 的建议)
db[, x:=NULL][, x:= mean(y), by= id][]

关于r - 在 R 中执行 := by group in a data. 表时如何更改目标列的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29643820/

相关文章:

r - R中系统发育图上的彩色线条

r - data.table 聚合到列表列

r - 按名称向量过滤数据表中的列

R:数据表按列名称向量分组

r - Shiny 的服务器 session 超时不起作用

r - 由生存包中的 survfit 函数生成的生存曲线

r - 如何编写一个 for 循环来创建模型并具有引用同一模型的函数

haskell - 将数字限制在一个范围内(Haskell)

python - "dict-like"在 Python 中是什么意思?

Python 字符串到 float 的转换