【问题标题】:appending new data to specific elements in lists in r将新数据附加到 r 列表中的特定元素
【发布时间】:2012-09-10 19:57:43
【问题描述】:

如果我的术语有误,请纠正我,因为在这个问题上,我不太确定我在处理元素、对象、列表方面的内容。我只知道它不是数据框。 使用来自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 的结构,它是一个由 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 的 "tab" 元素附加到 07,然后将 09 附加到 07/08。并对列表"x""weight""factor" 元素执行相同操作。你如何绑定这些数据?我考虑过在列表的每个段上使用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)

也许是rbinddo.call("rbind", lapply(....uh...stuck

【问题讨论】:

  • “我将创建多个 x 列表并希望将列表中的每个元素附加到 1 个列表中。”嗯?
  • 感谢您提供str(x)dput(x) 也会非常有用。
  • @BlueMagister 我没有放 dput(x) 因为我提供的代码的第一部分任何人都可以运行,只需复制和粘贴即可。我认为它可以避免创建长消息,因为我更关心的是如何将新数据加入列表中的不同部分。
  • @joran 为不应该出现的内容道歉。我还改写了措辞并试图使我所说的更清楚。

标签: r list append rbind


【解决方案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 向导,这可能不是最好的答案。

【讨论】:

  • 需要一些程序集 :) 我在 match.names(clabs, names(xi)) 中遇到错误:名称与以前的名称不匹配。我认为这是因为“选项卡”段中有一个名为 map07 或 map08 的变量。所以我必须重命名该变量,然后你的函数应该可以工作。 'recursive' 是做什么的,为什么在 $weight 或 $factor 之后使用它时,它不在 "x$tab" 之后使用?那是“lapply”还是“do.call”的一部分?
  • 您需要确保数据框列的名称都相同,因此不要使用function(x) x$tab,而是执行function(x) {y &lt;- x$tab; names(y) &lt;- tab.names; return(y)} 之类的操作,其中tab.names 是名称向量。 recursive=TRUE 告诉 clapply 返回的列表中的内容组合起来;有关详细信息,请参阅?c。因为weightfactor是向量,所以可以和c组合。由于tab是一个数据框,所以需要不同的过程进行组合。详情请见?do.call
  • 感谢您对递归和 c 的解释。它有助于澄清一些读数。我遵循了使用as.characteras. factor 的建议。但我失去了名字。我的新行写着factor=as.factor(as.character(c(lapply(wprep,function(x) x$factor),recursive=TRUE))),它将所有级别都变成“数字”,而不是保留我分配的角色名称。抱歉称它为因素,这就是示例中使用的 adehabitatHS
  • 您想在与c 结合之前转换为字符。试试:factor=as.factor(c(lapply(wprep,function(x) as.character(x$factor)),recursive=TRUE))
猜你喜欢
  • 2014-06-10
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2015-01-23
  • 2019-11-06
相关资源
最近更新 更多