2012-09-18 68 views
2

如果我的术语错误,请纠正我的问题,因为在这个问题上我不太清楚我在处理元素,对象,列表时我处理了什么......我只知道它不是数据框。 使用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"。现在,我想追加"tab"元素08到07,然后是09到07/08。并对的"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

+0

“我将创建多个x列表并希望追加列表中的每个元素以创建1个列表。”咦? – joran

+0

感谢您给予'str(x)'。 'dput(x)'也会非常有用。 –

+0

@BlueMagister我没有把dput(x)放入,因为我提供的任何代码的第一部分都可以运行,只需复制粘贴即可。我认为它会避免创建一个长信息,因为我更关心如何将新数据加入列表中的不同部分。 – Kerry

回答

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

+0

需要一些程序集:)我在match.names(clabs,names(xi))中得到一个错误:名称与先前的名称不匹配。我认为这是因为'tab'部分中有一个名为map07或map08的变量​​。所以我必须重命名该变量,然后您的功能应该工作。 “递归”是做什么的,为什么在$ weight或$ factor之后使用“x $ tab”之后它没有被使用?是'lapply'还是'do.call'的一部分? – Kerry

+1

您需要确保数据帧列的名称完全相同,所以不要使用'function(x)x $ tab',而应该使用'function(x){y < - x $ tab; names(y)< - tab.names; return(y)}'其中'tab.names'是名称的向量。 'recursive = TRUE'告诉''c'在'lapply'返回的列表中组合东西;有关更多详细信息,请参阅'?c'。因为'weight'和'factor'是向量,所以它们可以和'c'组合。由于'tab'是一个数据框,组合需要一个不同的过程。有关详细信息,请参阅'?do.call'。 –

+0

感谢您对递归和c的解释。它有助于澄清一些读数。我遵循了使用'as.character'和'as的建议。 factor'。但我失去了名字。我的新行说'factor = as.factor(as.character(c(lapply(wprep,function(x)x $ factor),recursive = TRUE)))'并且将所有级别转换为“数字”而不是保留我分配的角色名称。对不起,将它称为因子,这就是在'adehabitatHS'示例中使用的那个因子。 – Kerry