R给定一个数据框列表,如何向数据框的所有行添加新列

时间:2018-07-19 08:38:41

标签: r dataframe

我的情况如下:有一个数据帧列表

  

class(cc.purc $ items)=>“列表”

     

length(cc.purc $ items)=> 970

     

class(cc.purc $ items [[1]])=>“ data.frame”

     

head(cc.purc $ items,2)

[[1]]

    barcode quantity price amount grams litres   
1       abc        1  1.00   1.00    NA     NA           
2       xyz        1  1.29   1.29    NA     NA          

[[2]]

   barcode quantity price amount grams litres 
1     abc2        1   5.5    5.5    NA     NA              
2     xyz2       -1  19.5  -19.5    NA     NA         

cc.purc在“项目”列表中的每个数据框都有一个名为“ transaction_id”的字段。

  

head(cc.purc $ transaction_id,2)=>“ 62740”“ 62741”

我要打印列表中包含的所有数据框中的所有行,并在所有行中添加相应的transaction_id作为附加列。

例如:想要关注

  barcode quantity price amount grams litres    tran_id
1     abc        1  1.00   1.00    NA     NA      62740          
2     xyz        1  1.29   1.29    NA     NA      62740       
3    abc2        1   5.5    5.5    NA     NA      62741             
4    xyz2       -1  19.5  -19.5    NA     NA      62741   

如何实现?请帮忙。

要从“项目”列表中的所有DF中获取所有行,我可以执行以下操作:

  

do.call(“ rbind”,cc.purc $ items)

但是我不知道如何在所有相关行中添加对应的列(transaction_id)?

1 个答案:

答案 0 :(得分:1)

您可以使用Map()同时遍历数据和交易ID。

示例数据:

test <- list(data = list(data.frame(var1 = rnorm(4),
                                    var2 = runif(4)),
                         data.frame(var1 = rnorm(4),
                                    var2 = runif(4)),
                         data.frame(var1 = rnorm(4),
                                    var2 = runif(4))),
             tran_id = c(1:3))

# add new column to every dataframe

test$data <- Map(function(x, y){
  x$tran_id <- y
  return(x)
}, test$data, test$tran_id)

结果:

> test
$data
$data[[1]]
         var1       var2 tran_id
1  0.99943735 0.57436983       1
2 -0.04483769 0.29832753       1
3  1.89678549 0.81138668       1
4 -0.58839397 0.07071112       1

$data[[2]]
          var1       var2 tran_id
1 -0.018843434 0.84813495       2
2 -0.258920304 0.09818365       2
3 -0.009920782 0.07873543       2
4  0.833070609 0.47808518       2

$data[[3]]
         var1      var2 tran_id
1  1.21224941 0.3587937       3
2 -0.65107256 0.9727788       3
3  1.54107062 0.8444594       3
4 -0.09976177 0.6034762       3


$tran_id
[1] 1 2 3

将数据绑定在一起:

> do.call("rbind", test$data)
           var1       var2 tran_id
1   0.999437345 0.57436983       1
2  -0.044837689 0.29832753       1
3   1.896785487 0.81138668       1
4  -0.588393971 0.07071112       1
5  -0.018843434 0.84813495       2
6  -0.258920304 0.09818365       2
7  -0.009920782 0.07873543       2
8   0.833070609 0.47808518       2
9   1.212249412 0.35879366       3
10 -0.651072562 0.97277883       3
11  1.541070621 0.84445938       3
12 -0.099761769 0.60347619       3