gpt4 book ai didi

r - 使用 setattr 更改列上的因子水平对列的创建方式很敏感

转载 作者:行者123 更新时间:2023-12-04 11:34:35 26 4
gpt4 key购买 nike

我想使用 setattr 更改列的因子水平. However, when the column is selected the standard data.table方式( dt[ , col] ),levels没有更新。另一方面,在 data.table 中以非正统方式选择列时设置——即使用 $ -有用。

library(data.table)

# Some data
d <- data.table(x = factor(c("b", "a", "a", "b")), y = 1:4)
d
# x y
# 1: b 1
# 2: a 2
# 3: a 3
# 4: b 4

# We want to change levels of 'x' using setattr
# New desired levels
lev <- c("a_new", "b_new")

# Select column in the standard data.table way
setattr(x = d[ , x], name = "levels", value = lev)

# Levels are not updated
d
# x y
# 1: b 1
# 2: a 2
# 3: a 3
# 4: b 4

# Select column in a non-standard data.table way using $
setattr(x = d$x, name = "levels", value = lev)

# Levels are updated
d
# x y
# 1: b_new 1
# 2: a_new 2
# 3: a_new 3
# 4: b_new 4

# Just check if d[ , x] really is the same as d$x
d <- data.table(x = factor(c("b", "a", "a", "b")), y = 1:4)
identical(d[ , x], d$x)
# [1] TRUE
# Yes, it seems so

感觉好像我错过了一些 data.table ( R ?) 基础知识在这里。任何人都可以解释发生了什么?

我在 setattr 上发现了另外两个帖子和 levels :

setattr on levels preserving unwanted duplicates (R data.table)

How does one change the levels of a factor column in a data.table

他们都用过 $选择列。他们都没有提到 [ , col]道路。

最佳答案

如果您从两个表达式中查看地址,可能有助于理解:

address(d$x)
# [1] "0x10e4ac4d8"
address(d$x)
# [1] "0x10e4ac4d8"


address(d[,x])
# [1] "0x105e0b520"
address(d[,x])
# [1] "0x105e0a600"

请注意,当您多次调用第一个表达式时,它的地址不会改变,而第二个表达式会改变,这表明由于地址的动态特性,它正在制作列的副本,因此 setattr对原来的data.table没有影响。

关于r - 使用 setattr 更改列上的因子水平对列的创建方式很敏感,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41539202/

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