子集时保留属性和类(rrapply?)

Posted

技术标签:

【中文标题】子集时保留属性和类(rrapply?)【英文标题】:retain attributes and classes when subsetting (rrapply?) 【发布时间】:2021-04-07 16:55:18 【问题描述】:

来自详情部分的?"["

子集(空索引除外)将删除除名称、dim 和 dimnames 之外的所有属性。

例子:

myobj <- structure(list(a = c(1, 2, 3), b = c(4, 5, 6)), class = "myclass")
attr(myobj, "someattr") <- "Hello World"
myobj
# $a
# [1] 1 2 3

# $b
# [1] 4 5 6

# attr(,"class")
# [1] "myclass"
# attr(,"someattr")
# [1] "Hello World"

因此,如果我将第一个位置子集化,则属性和类将被删除:

myobj[-c(2)]
# $a
# [1] 1 2 3

解决方法是创建method,见here和here。

这个解决方案已经很老了,我想知道现在有没有更简单/更快的方法来做到这一点,所以你不必创建一个方法? rrapply 浮现在脑海,但我认为它只能递归地将函数 f 应用于列表的一组元素:

library(rrapply)
rrapply(myobj,  f = head, n = 1, how = "list")
# $a
# [1] 1

# $b
# [1] 4

# attr(,"class")
# [1] "myclass"
# attr(,"someattr")
# [1] "Hello World"

有没有办法使用rrapply 以我想要保留属性和类的方式进行子集化,或者有更简单的方法来做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

1) gv 试试collapse包中的get_vars(可简写为gv):

library(collapse)
gv(myobj, -2)

给予:

$a
[1] 1 2 3

attr(,"class")
[1] "myclass"
attr(,"someattr")
[1] "Hello World"

2) Base R 或 NULL 去掉你不想要的组件:

replace(myobj, 2, NULL)

给予:

$a
[1] 1 2 3

attr(,"class")
[1] "myclass"
attr(,"someattr")
[1] "Hello World"

3) rrapply 我们可以将 rrapply 与 how = "prune" 一起使用。该条件确保仅返回具有指定名称的第一级组件。

library(rrapply)
cond <- function(x, .xname, .xpos) .xname %in% names(myobj)[-2] && .xpos == 1
rrapply(myobj, condition = cond, how="prune")

给予:

$a
[1] 1 2 3

attr(,"class")
[1] "myclass"
attr(,"someattr")
[1] "Hello World"

【讨论】:

以上是关于子集时保留属性和类(rrapply?)的主要内容,如果未能解决你的问题,请参考以下文章

如何对您的数据框进行子集化以在 R 中保留前 3 个重复行?

1.关键字保留字标识符命名规范

使用点语法设置保留属性时使用自动释放?

关于在属性中保留属性的问题

使用 svcutils 生成代理时如何保留一些自定义属性?

iOS 应用程序在释放保留属性时崩溃