【问题标题】:R given a list of dataframes, how to add a new column to all rows in dataframesR给定数据框列表,如何向数据框中的所有行添加新列
【发布时间】:2018-12-27 07:39:36
【问题描述】:

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

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

长度(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 为“items”列表中的每个数据帧都有一个名为“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)添加到所有相关行是我无法弄清楚的?

【问题讨论】:

标签: r dataframe


【解决方案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

【讨论】:

  • 请注意,transaction_id 的数量与所有 DF 中的行数不同。 transaction_id 的数量 = 列表中 DF 的数量,每个 DF 可以有可变的行数。所以,我希望 DF 中的所有行都有一个/相同的事务 id 对应于 DF,最后收集所有 DF 的所有行
  • 没关系。如果transaction_id 是与数据帧数长度相同的向量,则只需循环该向量即可。我会相应地改变我的例子。
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2018-02-09
  • 2022-12-18
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多