使用列表数据填充data.frame

时间:2014-04-03 10:51:56

标签: r list dataframe fill

我有一个像这样的数据框架,我用" bicho"在列表中:

row.names   bicho   freq    date     ndvi   date2     ndvi2  date3     ndvi3  ...
1           john     3   2009-04-08  5001 2009-04-23  4537  2009-05-09 3540 
1.1         john     3   2009-04-08  5001 2009-04-23  4537  2009-05-09 3540
1.2         john     3   2009-04-08  5001 2009-04-23  4537  2009-05-09 3540 
...         ...      .      ...       ..     ...       ..      ...      ..    ...
2           steve    4   2010-04-29  6338 2010-05-09  5145  2010-05-25 3318
2.1         steve    4   2010-04-29  6338 2010-05-09  5145  2010-05-25 3318
2.2         steve    4   2010-04-29  6338 2010-05-09  5145  2010-05-25 3318
2.3         steve    4   2010-04-29  6338 2010-05-09  5145  2010-05-25 3318

列表示例:

$ john:'data.frame':    14 obs. of  152 variables:
  ..$ bicho : Factor w/ 26 levels "john","john",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ freq  : num [1:14] 14 14 14 14 14 14 14 14 14 14 ...
  ..$ date  : Date[1:14], format: "2009-04-08" "2009-04-08" ...
  ..$ ndvi  : num [1:14] 5001 5001 5001 5001 5001 ...
  ..$ date2 : chr [1:14] "2009-04-23" "2009-04-23" "2009-04-23" "2009-04-23" ...
  ..$ ndvi2 : num [1:14] 4538 4538 4538 4538 4538 ...
  ..$ date3 : chr [1:14] "2009-05-09" "2009-05-09" "2009-05-09" "2009-05-09" ...
  ..$ ndvi3 : num [1:14] 3540 3540 3540 3540 3540 ...

该列表包含26个元素,每个元素与上面的元素类似。 我的目标是用一个数据框填充其中的所有元素,但是我想在其中进行一些新的列计算。最终的data.frame应如下所示:

row.names   bicho   freq     time1         time2      ndvi
1           john     3         0       (date2-date1)  5001 
1.1         john     3   (date2-date1) (date3-date2)  4537
1.2         john     3   (date3-date2) (date4-date3)  3540  
...         ...      .       ...             ...       ..
2           steve    4         0        (date2-date1) 6338 
2.1         steve    4   (date2-date1)  (date3-date2) 5145  
2.2         steve    4   (date3-date2)  (date4-date3) 3318
2.3         steve    4   (date4-date3)  (date5-date4) 1239

我的初始代码如下所示。问题是我想逐行填充最终的data.frame(1:563),列表元素的长度可变,但我找不到办法。

for(b in list){
   for(j in seq_along(df$bicho){
     for(i in seq_along(b$bicho)){
       print(i)
       if(i==1){
         df$tempo1[j]=0
         df$tempo2[j]=as.Date(b$date2[i])-b$date[i]
         df$NDVI<-b[i,4]
         df$tempo1[j+1]=df$tempo2[j]
        }}}}

此代码的目标是仅填充每个变量的第一行。

1 个答案:

答案 0 :(得分:0)

如何首先填充数据?

## make toy lists
ll1 <- list(bicho=rep("a",3),frep=rep(3,3),x=1:3,y=7:9)
ll2 <- list(bicho=rep("b",5),frep=rep(4,5),x=1:5,y=6:10)

## fill
ret <- c()
your.list.of.list <- list(ll1,ll2)
for (e in your.list.of.list){
  ret <- rbind(ret,do.call(cbind,e))
}
ret <- data.frame(ret,stringsAsFactors=FALSE)

然后您可以按列计算添加任何其他列

ret$z <- as.numeric(ret$y)-as.numeric(ret$x)
ret
> ret
  bicho frep x  y z
1     a    3 1  7 6
2     a    3 2  8 6
3     a    3 3  9 6
4     b    4 1  6 5
5     b    4 2  7 5
6     b    4 3  8 5
7     b    4 4  9 5
8     b    4 5 10 5
>