【问题标题】:How to print a DT with different digits for columns?如何为列打印具有不同数字的 DT?
【发布时间】:2020-10-08 09:51:47
【问题描述】:

在下面的玩具示例中,如何为V1V2V3 打印具有不同数字的data.table。

rm(list=ls())
set.seed(2020)
library(data.table)
 
x <- data.table(matrix(rnorm(10*3), 10))
print(x, digits=2)
       V1     V2     V3
 1:  0.38 -0.853  2.174
 2:  0.30  0.909  1.098
 3: -1.10  1.196  0.318
 4: -1.13 -0.372 -0.073
 5: -2.80 -0.123  0.834
 6:  0.72  1.800  0.199
 7:  0.94  1.704  1.298
 8: -0.23 -3.039  0.937
 9:  1.76 -2.289 -0.147
10:  0.12  0.058  0.110

【问题讨论】:

  • 但是你为什么要那个?

标签: r data.table


【解决方案1】:

不确定是否可以将数据保持为数字,但这里有一个使用正则表达式的技巧。

set.seed(2020)
library(data.table)
x <- data.table(matrix(rnorm(10*3), 10))
digits <- c(2, 3, 4)

x[, Map(function(x, y) sub(sprintf('(.*\\..{%s}).*', y), '\\1', x), .SD, digits)]

#       V1     V2      V3
# 1:  0.37 -0.853  2.1743
# 2:  0.30  0.909  1.0981
# 3: -1.09  1.196  0.3182
# 4: -1.13 -0.371 -0.0731
# 5: -2.79 -0.123  0.8342
# 6:  0.72  1.800  0.1987
# 7:  0.93  1.703  1.2978
# 8: -0.22 -3.038  0.9367
# 9:  1.75 -2.288 -0.1474
#10:  0.11  0.058  0.1104

使用sprintf,我们创建了一个模式来为每一列提取digits 中定义的不同位数。例如,对于digits 中的第一个值,即 2,模式将变为

sprintf('(.*\\..{%s}).*', y)
#[1] "(.*\\..{2}).*"

意思是提取所有内容,直到 "." 和它之后的 2 个字符。同样,我们对其他列也这样做。

【讨论】:

  • 虽然Mapsub(sprintf(...)) 的组合似乎有效,但它直接截断了值。是否可以通过预先指定的数字达到round 的结果?
  • @zengchao 它与round 的工作方式类似:x[, Map(function(x, y) round(x, y), .SD, digits)]
  • 是的,你是对的。我尝试了类似的方式。谢谢你。
【解决方案2】:

在 Ronak 的推动下,以下解决方案有效。

rm(list=ls())
set.seed(2020)
library(data.table)
x <- data.table(matrix(rnorm(10*3), 10))
digits <- 2:4
x[, mapply(round, .SD, digits)]

         V1     V2      V3
 [1,]  0.38 -0.853  2.1744
 [2,]  0.30  0.909  1.0982
 [3,] -1.10  1.196  0.3182
 [4,] -1.13 -0.372 -0.0731
 [5,] -2.80 -0.123  0.8343
 [6,]  0.72  1.800  0.1988
 [7,]  0.94  1.704  1.2978
 [8,] -0.23 -3.039  0.9367
 [9,]  1.76 -2.289 -0.1474
[10,]  0.12  0.058  0.1104

【讨论】:

  • 为此,获取data.table的类似方法是x[, lapply(.SD, round, digits)]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多