gpt4 book ai didi

r - 转换 data.table 中的*一些*列类

转载 作者:行者123 更新时间:2023-12-03 11:34:31 24 4
gpt4 key购买 nike

我想将 data.table cols 的一个子集转换为一个新类。这里有一个流行的问题 ( Convert column classes in data.table ),但答案会创建一个新对象,而不是对启动对象进行操作。

拿这个例子:

dat <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
cols <- c('ID', 'Quarter')

如何最好地转换为 cols列到(例如)一个因素?在普通的 data.frame 中,您可以这样做:
dat[, cols] <- lapply(dat[, cols], factor)

但这对 data.table 不起作用,这也不起作用
dat[, .SD := lapply(.SD, factor), .SDcols = cols]

来自 Matt Dowle(2013 年 12 月)的链接问题中的评论建议如下,效果很好,但似乎不太优雅。
for (j in cols) set(dat, j = j, value = factor(dat[[j]]))

目前是否有更好的 data.table 答案(即更短的 + 不会生成计数器变量),或者我应该使用上面的 + rm(j) ?

最佳答案

除了使用 Matt Dowle 建议的选项之外,另一种更改列类的方法如下:

dat[, (cols) := lapply(.SD, factor), .SDcols = cols]

通过使用 :=运算符(operator)通过引用更新数据表。检查这是否有效:
> sapply(dat,class)
ID Quarter value
"factor" "factor" "numeric"

正如@MattDowle 在评论中所建议的,您还可以使用 for(...) set(...) 的组合如下:
for (col in cols) set(dat, j = col, value = factor(dat[[col]]))

这将给出相同的结果。第三种选择是:
for (col in cols) dat[, (col) := factor(dat[[col]])]

在较小的数据集上, for(...) set(...)选项大约比 lapply 快三倍选项(但这并不重要,因为它是一个小数据集)。在较大的数据集(例如 200 万行)上,这些方法中的每一种都需要大约相同的时间。为了在更大的数据集上进行测试,我使用了:
dat <- data.table(ID=c(rep("A", 1e6), rep("B",1e6)),
Quarter=c(1:1e6, 1:1e6),
value=rnorm(10))

有时,您必须以不同的方式执行此操作(例如,当数值存储为因子时)。然后你必须使用这样的东西:
dat[, (cols) := lapply(.SD, function(x) as.integer(as.character(x))), .SDcols = cols]



警告:以下解释为 不是 data.table ——做事的方式。数据表不会通过引用更新,因为复制并存储在内存中(如@Frank 所指出的那样),这会增加内存使用量。更多的是为了解释 with = FALSE的工作原理的补充。 .

如果您想以与数据框相同的方式更改列类,则必须添加 with = FALSE如下:
dat[, cols] <- lapply(dat[, cols, with = FALSE], factor)

检查这是否有效:
> sapply(dat,class)
ID Quarter value
"factor" "factor" "numeric"

如果不添加 with = FALSE ,数据表将评估 dat[, cols]作为向量。检查 dat[, cols] 之间的输出差异和 dat[, cols, with = FALSE] :
> dat[, cols]
[1] "ID" "Quarter"

> dat[, cols, with = FALSE]
ID Quarter
1: A 1
2: A 2
3: A 3
4: A 4
5: A 5
6: B 1
7: B 2
8: B 3
9: B 4
10: B 5

关于r - 转换 data.table 中的*一些*列类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com