子集时保留属性和类(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?)的主要内容,如果未能解决你的问题,请参考以下文章