2

(请随意将标题更改为更合适的名称)

我有一个类似下面的列表。我想要做的是将cbind每个names嵌套列表中的每一个添加到该列表中的一个新列。另外,我希望strsplit每个namesby/所以实际上cbind是两列,即 Nrep=rep1 和 sp=sp1,每列的行数与嵌套列表本身的行数相同。

`rep1/sp1` <- read.table(text= "var,X2x,X4x,X6x
                101337,4.631833,4.4547,11.097333
                345754,3.727433,10.8560,10.536600" ,header=TRUE, sep=",")

`rep1/sp2` <- read.table(text= "var,X2x,X4x,X6x
               101337,5.631833,10.4547,11.097333
               345754,5.727433,12.8560,10.536600" ,header=TRUE, sep=",")

dflist <- list(`rep1/sp1`=`rep1/sp1`, `rep1/sp2`=`rep1/sp2`)

我的想法是尝试分两步完成;提取names+strsplit然后将cbind每个提取到正确的嵌套列表中,产生如下所示的输出。但是,我无法理解如何进行最后一步。

rep_sp <- names(dflist)
rep_sp <- strsplit(rep_sp, "/")
rep_sp <- lapply(rep_sp, function(x) data.frame(t(cbind(x))))
rep_sp <- ldply(rep_sp, data.frame)
colnames(rep_sp) <- c("Nrep","sp")

# hit the wall...

期望的输出

> dflist
$`rep1/sp1`
Nrep  sp    var      X2x     X4x      X6x
rep1 sp1 101337 4.631833  4.4547 11.09733
rep1 sp1 345754 3.727433 10.8560 10.53660

$`rep1/sp2`
Nrep  sp    var      X2x     X4x      X6x
rep1 sp2 101337 5.631833 10.4547 11.09733
rep1 sp2 345754 5.727433 12.8560 10.53660

任何关于此的指针将不胜感激,谢谢!

4

1 回答 1

2

如果它们不必是第一列和第二列,那么

rep_sp <- names(dflist)
rep_sp <- strsplit(rep_sp, "/")
Map(cbind, dflist, 
    Nrep = sapply(rep_sp,'[',1),
    sp = sapply(rep_sp,'[',2))

可以工作并且非常简单(仅使用基本功能)

$`rep1/sp1`
     var      X2x     X4x       X6x Nrep  sp
1 101337 4.631833  4.4547 11.097333 rep1 sp1
2 345754 3.727433 10.8560 10.536600 rep1 sp1

$`rep1/sp2`
     var      X2x     X4x       X6x Nrep  sp
1 101337 5.631833 10.4547 11.097333 rep1 sp2
2 345754 5.727433 12.8560 10.536600 rep1 sp2

我没有将它们放在首位的原因是,当您使用Map它时,它将使用您传递的第一个数据参数命名列表的元素。因此,通过dflist首先传递,我保留了这些名称。您可以重新排列参数,然后用类似的东西在后面重置名称names(newobj)<-names(dflist)

于 2014-06-06T18:47:58.487 回答