【问题标题】:retain attributes and classes when subsetting (rrapply?)子集时保留属性和类(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,见herehere

这个解决方案已经很老了,我想知道现在有没有更简单/更快的方法来做到这一点,所以你不必创建一个方法? 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 以我想要保留属性和类的方式进行子集化,或者有更简单的方法来做到这一点?

谢谢

【问题讨论】:

    标签: r subset


    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 2022-12-10
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      相关资源
      最近更新 更多