R 如何为列打印具有不同数字的DT?

R 如何为列打印具有不同数字的DT?,r,data.table,R,Data.table,在下面的玩具示例中,如何打印具有不同数字的data.table(适用于V1、V2和V3) 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

在下面的玩具示例中,如何打印具有不同数字的data.table(适用于
V1
V2
V3

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
rm(list=ls())
设定种子(2020年)
库(数据表)

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

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

意思是提取所有内容,直到有一个
和后面的两个字符。类似地,我们对其他列也这样做。

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

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

意思是提取所有内容,直到有一个
和后面的两个字符。类似地,我们对其他专栏也这样做。

在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
rm(list=ls())
设定种子(2020年)
库(数据表)

x在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
rm(list=ls())
设定种子(2020年)
库(数据表)

但是为什么要这样呢?但是为什么要这样呢?虽然
Map
sub(sprintf(…)
的组合似乎有效,但它直接表示值。它能用预先指定的数字达到
round
结果吗?@增超它的工作方式与
round
类似:
x[,Map(函数(x,y)round(x,y),.SD,digits)]
是的,你是对的。我也试过类似的方式。谢谢你。虽然
Map
sub(sprintf(…)
的组合似乎有效,但它直接表示值。它能用预先指定的数字达到
round
结果吗?@增超它的工作方式与
round
类似:
x[,Map(函数(x,y)round(x,y),.SD,digits)]
是的,你是对的。我也试过类似的方式。感谢您。为此,获取data.table的类似方法是
x[,lappy(.SD,round,digits)]
。为此,获取data.table的类似方法是
x[,lappy(.SD,round,digits)]