0
次のデータ
は、たとえば、データ・セットである:安全にpurrrから結果を抽出するには?
apply_W99 <- function(df){
for(i in (seq_len(nrow(df)-1) + 1)) {
if(i <= 2L) {
df$Un_dt_1[i] <- df$svel[i-1] * 3.6 +
3.6 * (df$CC8[i] + (df$CC8[i] - df$CC9[i]) *
df$svel[i-1] * 3.6/80) * 0.1
df$Un_dt_2[i] <- 3.6 * (df$frspacing[i-1] - df$CC0[i])/0.1
} else {
df$Un_dt_1[i] <- df$Un_dt[i-1] +
3.6 * (df$CC8[i] + (df$CC8[i] - df$CC9[i]) *
df$Un_dt[i-1]/80) * 0.1
df$Un_dt_2[i] <- 3.6 * (df$pred_frspacing[i-1] - df$CC0[i])/0.1
}
df$Un_dt[i] <- pmin(df$Un_dt_1[i], df$Un_dt_2[i])
if(i <= 2) {
df$pred_Local.Y[i] <- df$Local.Y[i-1] +
0.5 * ((df$Un_dt[i] + df$svel[i-1])/3.6) * 0.1
} else {
df$pred_Local.Y[i] <- df$pred_Local.Y[i-1] +
0.5 * ((df$Un_dt[i] + df$Un_dt[i-1])/3.6) * 0.1
}
df$pred_frspacing[i] <- df$PrecVehLocalY[i] - df$pred_Local.Y[i] - df$PrecVehLength[i]
}
return(df)
}
注:私は、データフレームveh
に次の関数を適用しています
:私は何をしたいか
> dput(veh)
structure(list(Vehicle.ID2 = c("857-850", "857-850", "857-850",
"857-850"), svel = c(12.21277, 12.22125, 12.2362, 12.26268),
frspacing = c(10.73435, 10.64279, 10.54999, 10.45493), Local.Y = c(394.76339,
395.98552, 397.20914, 398.43541), PrecVehLocalY = c(409.70444,
410.83501, 411.96583, 413.09704), CC0 = c(4.1374232, 4.1374232,
4.1374232, 4.1374232), CC8 = c(1.75, 1.75, 1.75, 1.75), CC9 = c(1.04,
1.04, 1.04, 1.04), PrecVehLength = c(4.2067, 4.2067, 4.2067,
4.2067)), .Names = c("Vehicle.ID2", "svel", "frspacing",
"Local.Y", "PrecVehLocalY", "CC0", "CC8", "CC9", "PrecVehLength"
), class = c("tbl_df", "data.frame"), row.names = c(NA, -4L))
元のデータフレームには複数のVehicle.ID2
があります。私はtidyr
とpurrr
を使ってこの機能を適用しました。また、をpurrr
に使用して、結果とエラーの両方を収集しています。
library(tidyr)
foob <- veh %>%
group_by(Vehicle.ID2) %>%
nest()
library(purrr)
foos <- foob %>%
mutate(joo = map(data, safely(apply_W99)))
これは問題なく動作します。今、私は結果を得たいです。 safely
はresult
とerror
でリストを作成します。例えば、データの場合:
> dput(foos$joo)
list(structure(list(result = structure(list(svel = c(12.21277,
12.22125, 12.2362, 12.26268), frspacing = c(10.73435, 10.64279,
10.54999, 10.45493), Local.Y = c(394.76339, 395.98552, 397.20914,
398.43541), PrecVehLocalY = c(409.70444, 410.83501, 411.96583,
413.09704), CC0 = c(4.1374232, 4.1374232, 4.1374232, 4.1374232
), CC8 = c(1.75, 1.75, 1.75, 1.75), CC9 = c(1.04, 1.04, 1.04,
1.04), PrecVehLength = c(4.2067, 4.2067, 4.2067, 4.2067), Un_dt_1 = c(NA,
44.73644328054, 45.5093762168213, 46.2847786738341), Un_dt_2 = c(NA,
237.489364799999, 249.715278159729, 245.301888411047), Un_dt = c(NA,
44.73644328054, 45.5093762168213, 46.2847786738341), pred_Local.Y = c(NA,
395.554351295563, 396.807765455249, 398.082684273174), pred_frspacing = c(NA,
11.0739587044369, 10.9513645447513, 10.8076557268256)), .Names = c("svel",
"frspacing", "Local.Y", "PrecVehLocalY", "CC0", "CC8", "CC9",
"PrecVehLength", "Un_dt_1", "Un_dt_2", "Un_dt", "pred_Local.Y",
"pred_frspacing"), row.names = c(NA, -4L), class = c("tbl_df",
"data.frame")), error = NULL), .Names = c("result", "error")))
はどのようにして、新たなデータフレームとしてのみresult
一部を得ることができますか?
foos <- unnest(foos, map(joo, transpose()))
を使ってみましたが、うまくいきませんでした。ここから
を試してみてくださいあなたはそれがどこにあるかあなたが知っていると仮定すると、ちょうどインデックスそれができ:それは、[[1]] 'FOOSする$ヨンジュの$ result' – alistaire
@alistaireを良い提案と私はそれを試してみました。しかし、 'result'が' NULL'のとき、 'NULL'はデータフレームではないのでエラーを投げます。 –
私はそれを 'purrr'できると思います。' foos%>%select(joo)%>%as.list()%>%map(1)%>%map_df( 'result') '。正直なところ、まず関数をクリーンアップするので、処理するエラーはありません。 – alistaire