gpt4 book ai didi

r - tidyr::unite 的数据表版本

转载 作者:行者123 更新时间:2023-12-04 11:36:10 28 4
gpt4 key购买 nike

我需要在我巨大的 data.table 中将几列与分隔符联合起来.所以我使用 unite来自 tidyr为它打包。

不知道有没有data.table优化版本?

library(data.table)
data <- data.table(id=1:10, col1=11:20, col2=21:30, col3=31:40)
print(data)

library(tidyr)
data <- unite(data, "col_test", col1, col2, col3)
print(data)

最佳答案

我们可以使用 do.callpaste

data[, .(id, col_test=do.call(paste, c(.SD, sep="_"))), .SDcols= col1:col3]
# id col_test
# 1: 1 11_21_31
# 2: 2 12_22_32
# 3: 3 13_23_33
# 4: 4 14_24_34
# 5: 5 15_25_35
# 6: 6 16_26_36
# 7: 7 17_27_37
# 8: 8 18_28_38
# 9: 9 19_29_39
#10: 10 20_30_40

基准
microbenchmark(
tidyr_unite = {
unite(data1, "col_test", col1, col2, col3)
},
dt_docallPaste = {
data1[, .(id = data1[["id"]], col_test = do.call(paste, c(.SD, sep="_"))),
.SDcols= col1:col3]
},
apply_Paste = {
cbind.data.frame(id = data1$id,
col_test = apply(data1[, -1, with = FALSE], 1,
paste, collapse = "_"))
},
times = 10
)

# Unit: seconds
# expr min lq mean median uq max neval cld
# tidyr_unite 7.501491 7.521328 7.720600 7.647506 7.756273 8.219710 10 a
# dt_docallPaste 7.530711 7.558436 7.910604 7.618165 8.429796 8.497932 10 a
# apply_Paste 44.743782 45.797092 46.791288 46.325188 47.330887 51.155663 10 b

与基础相比 apply ,看起来像 tidyrdata.table版本同样有效。预期为 unite只是 do.call("paste", ...) 的包装器

正如您从 source code 中看到的:
unite_.data.frame <- function(data, col, from, sep = "_", remove = TRUE) {
united <- do.call("paste", c(data[from], list(sep = sep)))

first_col <- which(names(data) %in% from)[1]

data2 <- data
if (remove) {
data2 <- data2[setdiff(names(data2), from)]
}

append_col(data2, united, col, after = first_col - 1)
}

关于r - tidyr::unite 的数据表版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37545051/

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