以下にその一部を示すデータフレームのリストがあります。
> 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
.
.
.
.
このリストの87個のデータフレームの要素にカスタム関数dcast()を使用したいと思います。望ましい結果は、データフレームの列数に応じて、データフレームごとに次のようになります。
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
......。
エラーをスローしている空のデータフレームのピエールの発見を引き出して、あなたは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"))
これにより、データフレームのリストが返され、nullデータフレームはそのまま保持されます。それらを削除したい場合は、マップの前にそれらを除外します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加