将新数据附加到r中列表中的特定元素

时间:2012-09-18 14:22:31

标签: r list append rbind

如果我的术语错误,请纠正我,因为在这个问题上我不太清楚我在处理有关元素,对象,列表的事情。我只知道它不是数据框。 使用prepksel {adehabitatHS}中的示例我试图修改自己的数据以适应他们的包。在其示例数据上运行此命令会创建一个对象吗?叫x这是一个有3个部分的列表?元素?它。 示例数据代码:

 library(adehabitatHS)
    data(puechabonsp)
    locs <- puechabonsp$relocs
    map <- puechabonsp$map
    pc <- mcp(locs[,"Name"])
    hr <- hr.rast(pc, map)
    cp <- count.points(locs[,"Name"], map)
     x <- prepksel(map, hr, cp)

查看x的结构,它是一个名为tab,weight和factor

的3个元素的列表
str(x) 
List of 3
 $ tab   :'data.frame': 191 obs. of  4 variables:
  ..$ Elevation : num [1:191] 141 140 170 160 152 121 104 102 106 103 ...
  ..$ Aspect    : num [1:191] 4 4 4 1 1 1 1 1 4 4 ...
  ..$ Slope     : num [1:191] 20.9 18 17 24 23.9 ...
  ..$ Herbaceous: num [1:191] 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 ...
 $ weight: num [1:191] 1 1 1 1 1 2 2 4 0 1 ...
 $ factor: Factor w/ 4 levels "Brock","Calou",..: 1 1 1 1 1 1 1 1 1 1 ...

对于我的数据,我将创建多个"x"列表,并希望合并每个段中的数据。所以,我在2007,2008和2009年创建了一个"x"。现在,我想要追加08到07年的"tab"元素,然后是09到07/08。并对此列表"weight"的{​​{1}}和"factor"元素执行相同操作。你如何绑定这些数据?我考虑在列表的每个段上使用"x",然后附加然后加入每个段的年度数据,然后将这三个段重新加入一个列表中。但这很麻烦,看起来效率很低。

我知道这不是它的工作方式,但在我的脑海里,这就是我应该做的事情:

unlist

也许newlist<-append(x07$tab, x08$tab, x09$tab) newlist<-append(x07$weight, x08$weight, x09$weight) newlist<-append(x07$factor, x08$factor, x09$factor) rbind

1 个答案:

答案 0 :(得分:1)

append适用于矢量和列表,但不会为数据帧提供所需的输出,列表中的元素(以及它们是列表)具有不同的类型。像

这样的东西
tocomb <- list(x07,x08,x09)
newlist <- list(
  tab = do.call("rbind",lapply(tocomb,function(x) x$tab)), 
  weight = c(lapply(tocomb,function(x) x$weight),recursive=TRUE), 
  factor = c(lapply(tocomb,function(x) x$factor),recursive=TRUE)
)

如果因素具有不同的级别,您可能需要小心谨慎 - 类似as.character之前的因素,然后再使用as.factor转换回来。

这未经过测试,因此可能需要进行一些装配。我不是R精灵,这可能不是最好的答案。