【问题标题】:Apply dcast() function to the list of dataframes [closed]将 dcast() 函数应用于数据帧列表 [关闭]
【发布时间】:2017-03-29 12:05:52
【问题描述】:

我有一个数据框列表,我在下面展示了其中的一些:

> str(ls.df.val.keep)

List of 87
 $ AT_VALUES_IMV_EU28_EXTRA  :'data.frame': 1554 obs. of  4 variables:
  ..$ PARTNER        : Factor w/ 3 levels "EU28_EXTRA","EU28_INTRA",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ PRODUCT        : int [1:1554] 2207 2207 2207 2207 2207 2207 2207 2207 2207 2207 ...
  ..$ PERIOD         : Date[1:1554], format: "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" ...
  ..$ INDICATOR_VALUE: num [1:1554] 1033828 291810 227820 104650 254214 ...
 $ AT_VALUES_IMV_EU28_INTRA  :'data.frame': 4380 obs. of  4 variables:
  ..$ PARTNER        : Factor w/ 3 levels "EU28_EXTRA","EU28_INTRA",..: 2 2 2 2 2 2 2 2 2 2 ...
  ..$ PRODUCT        : int [1:4380] 2207 2207 2207 2207 2207 2207 2207 2207 2207 2207 ...
  ..$ PERIOD         : Date[1:4380], format: "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" ...
  ..$ INDICATOR_VALUE: num [1:4380] 1894626 2177029 1271173 994368 1746904 ...
 $ AT_VALUES_IMV_IN          :'data.frame': 6 obs. of  4 variables:
  ..$ PARTNER        : Factor w/ 3 levels "EU28_EXTRA","EU28_INTRA",..: 3 3 3 3 3 3
  ..$ PRODUCT        : int [1:6] 2208 2208 220890 220890 22089069 22089069
  ..$ PERIOD         : Date[1:6], format: "2010-09-01" "2012-07-01" "2010-09-01" "2012-07-01" ...
  ..$ INDICATOR_VALUE: num [1:6] 58 37 58 37 58 37
.
.
.
.

我想对这个列表的元素使用自定义函数 dcast(),这些元素是我的 87 个数据帧。每个数据框的预期结果应如下所示,具体取决于其拥有的列数:

   22082027 22082029 22082040 22082062 22082086 22082089 22083011 22083019 22083030 22083041 22083061 22083069 22083071 22083082 22084011
1        NA       NA       NA       NA       NA       NA   400675       NA     3103       NA      186       NA       NA       NA    22297
2        NA     2594       NA       NA       NA       NA   667309     3011       NA       NA       NA       NA       NA     1916       NA
3        NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA      263    93482
4        NA       NA       NA       NA       NA       NA   503155     4516       NA       NA       NA       NA       NA     5359       NA
5        NA      175       NA       NA       NA       NA   226936     4514       NA       NA       NA       NA    39389       NA       NA

我已经尝试了各种解决方案和代码片段,但都不起作用:

## First solution
all.cast <- list()
for (i in 1:length(ls.df.val.keep)) {
  all.cast[[i]] <- dcast(ls.df.val.keep[[i]], PERIOD ~ PRODUCT, value.var = "INDICATOR_VALUE")
}
ls.df.val.dcas <- list()
ls.df.val.dcas <- lapply(names(ls.df.val.keep), myfunc)

它会产生错误:

Error: value.var (INDICATOR_VALUE) not found in input
Called from: cast(data, formula, fun.aggregate, ..., subset = subset, fill = fill, 
    drop = drop, value.var = value.var)

第二种解决方案

ls.df.val.dcas < - lapply(ls.df.val.keep, function(x) dcast(x, PERIOD ~ PRODUCT, value.var="INDICATOR_VALUE"))

错误是:

Error in dim(ordered) <- ns : 
  dims [product 1] do not match the length of object [0]

第三种解决方案

llply(ls.df.val.keep, .fun=function(x) dcast(x, PERIOD ~ PRODUCT, value.var="INDICATOR_VALUE"))

错误是:

Error in do.ply(i) : 
  task 9 failed - "dims [product 1] do not match the length of object [0]"
In addition: Warning message:
In setup_parallel() : No parallel backend registered

第四个解决方案(绝望一)

all.cast <- list()
for (i in 1:length(ls.df.val.keep)) {
  all.cast[[i]] <- dcast(ls.df.val.keep[[i]], PERIOD ~ PRODUCT, value.var = "INDICATOR_VALUE")
}

又报错了:

Error in dim(ordered) <- ns : 
  dims [product 1] do not match the length of object [0]

很奇怪,如果我输入每个数据框的名称或只是列表的元素,例如ls.df.val.keep[[3]],它们有效!我还有很多其他的事情要使用 lapply 对这个列表做,但我被困在了第一步! 有什么我没看到的吗?

已编辑。

我正在按照@Jake 的要求添加我的数据框数据示例:

> head(ls.df.val.keep[[1]])
         PARTNER    PRODUCT     PERIOD             INDICATOR_VALUE
58136 EU28_EXTRA    2207     2010-01-01         1033828
58138 EU28_EXTRA    2207     2010-02-01         291810
58140 EU28_EXTRA    220710   2010-03-01         227820
58142 EU28_EXTRA    220710   2010-04-01         104650
58144 EU28_EXTRA    22071000 2010-09-01         254214
58146 EU28_EXTRA    22071000 2010-10-01         572446

.. .. ..

【问题讨论】:

  • 在第二个解决方案中,val.dcas &lt; - 应该是val.dcas &lt;-
  • 你从all(sapply(ls.df.val.keep, function(x) length(dim(x)) == 2 &amp;&amp; all(dim(x) &gt; 0)))得到什么?
  • @imo。谢谢。这是一个错字。我编辑了这个问题。错字并没有导致任何错误。
  • @皮埃尔。我得到:[1] 错误
  • 它应该返回TRUE。您的列表中有一个不是有效数组的对象。把上面测试的第一部分改成which(sapply(ls.df.val.keep,.....),就知道问题出在哪里了。

标签: r plyr lapply reshape2 dcast


【解决方案1】:

引入 Pierre 发现的空数据框抛出错误,您可以使用 purrr 来实现您的目标。

library(purrr)
library(dplyr)
library(reshape2)

dcast_list <- map_if(ls.df.val.keep, negate(is_empty), ~dcast(.x, PERIOD ~ PRODUCT, value.var = "INDICATOR_VALUE"))

这将返回一个数据帧列表,并保持空数据帧不变。如果您想删除它们,请在映射之前将它们过滤掉。

【讨论】:

  • 它犯了我提到的错误之一。正是这个:暗淡(有序)中的错误
  • 还是这样吗?我使用您提供的数据以及列表中的空数据框对此进行了测试,它可以正常工作。
  • 您提供的代码很好,问题出在我的列表数组之一是空的。干杯
  • 太好了,只是想知道您是否还需要帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2014-12-06
  • 2020-04-22
相关资源
最近更新 更多