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