gpt4 book ai didi

r - data.table 在函数中使用时的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 01:41:57 25 4
gpt4 key购买 nike

我有一个 data.frame如下。

data <- structure(list(V1 = structure(1:3, .Label = c("S01", "S02", "S03"), class = "factor"), V2 = structure(c(1L, 3L, 2L), .Label = c("Alan", "Bruce", "Jay"), class = "factor"), V3 = structure(c(3L, 1L, 2L), .Label = c("Barry", "Dick", "Hal"), class = "factor"), V4 = structure(c(1L, 3L, 2L), .Label = c("Guy", "Jean-Paul", "Wally"), class = "factor"), V5 = structure(c(3L, 1L, 2L), .Label = c("Bart", "Damien", "John"), class = "factor")), .Names = c("V1", "V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, -3L))

它不是 data.table

is.data.table(data)
[1] FALSE

我有一个函数 foo例如,它利用 data.tabledata.frame 中进行一些操作如下。

foo <- function(df) {
if(!is.data.frame(df)) stop('"df" is not a data.frame')
setDT(df)
setkey(df, V1)
df[, "NEW" := paste0(V3, V4), with = FALSE]
setDF(df)
return(df)
}

然而,当我使用 data.frame 运行函数时data (不是 data.table ),输出 outdata.frame (因为 setDF(df) )。

out <- foo(data)
is.data.table(out)
[1] FALSE

但现在原来data.frame datadata.table .

is.data.table(data)
[1] TRUE

我明白这是因为 data.table通过引用工作。但是在函数中使用时如何处理这个问题。我不想无意中更改环境中的任何 data.frame。我应该总是用 copy 强制复制吗?或 <-而不是 setDT每当data.table在函数中使用,还是有其他方式?

最佳答案

关于

is there another way?

您可以在函数内使用 as.data.table() 而不是 setDT()

foo <- function(df) {
if(!is.data.frame(df)) stop('"df" is not a data.frame')
df <- as.data.table(df)
setkey(df, V1)
df[, NEW := paste0(V3, V4)]
setDF(df)
return(df)
}

foo(data)
# V1 V2 V3 V4 V5 NEW
# 1 S01 Alan Hal Guy John HalGuy
# 2 S02 Jay Barry Wally Bart BarryWally
# 3 S03 Bruce Dick Jean-Paul Damien DickJean-Paul

is.data.table(data)
# [1] FALSE

有关将输入数据 frame 转换为数据 table 但根本不更改原始数据帧的函数示例,我绝对建议您查看splitstackshape 包中函数的源代码。

关于r - data.table 在函数中使用时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28097397/

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