我有五個data frame尺寸相同(8 x 2)但不同column name的 s,如下所示:
nbb <- (
nbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
nbb_RMSE = c(1.0152338, 0.7199394, 0.7990978, 0.9045563, 1.6514406, 0.5160516, 0.4964024, 0.2617795)
)
mbb <- (
mbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
mbb_RMSE = c(0.8324074, 0.9278236, 1.9817984, 0.9567368, 0.2814623, 0.1129459, 0.1233126, 0.4222578)
)
cbb <- (
cbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
cbb_RMSE = c(1.27782499, 1.96332220, 0.74704997, 0.46579943, 1.10850563, 0.40456698, 0.26027359, 0.02452239)
)
tmbb <- (
tmbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
tmbb_RMSE = c(0.83240742, 1.05126826, 0.08290467, 0.76397988, 1.23772208, 0.57628337, 0.56437185, 0.46460279)
)
tcbb <- (
tcbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
tcbb_RMSE = c(0.9328510, 0.8312332, 0.9402116, 1.6029357, 2.0001519, 0.4387557, 0.5965582, 0.4148854)
)
我想創建一個新的,它將包含上面五(5)sdata frame中包含的每一行。如果我將不同的 s 命名為 (nbb, mbb, cbb, tmbb, tcbb)minimum RMSEdata framerow namesdata frame
rownames(df) <- c("nbb", "mbb", "cbb", "tmbb", "tcbb")
我希望得到如下結果:
| df | 磅 | 均方根誤差 |
|---|---|---|
| nbb | 9 | 0.2617795 |
| mbb | 7 | 0.1129459 |
| cbb | 9 | 0.02452239 |
| tmbb | 4 | 0.08290467 |
| tcbb | 8 | 0.4387557 |
uj5u.com熱心網友回復:
首先將你的 5 個資料框組合成一個串列,然后使用它lapply來遍歷所有資料框并輸出必要的資訊。lapply()此外,使用do.callto row bind ( rbind) 結果包裝。最后,將結果更改為資料框并將行名轉換為列名
rownames_to_column("df")如果要使用行名稱而不是存盤資料框名稱的列,則可以跳過。
library(tibble)
df_list <- list(nbb = nbb, mbb = mbb, cbb = cbb, tmbb = tmbb, tcbb = tcbb)
do.call(rbind, lapply(df_list, function(x) data.frame(lb = x[which.min(x[,2]), 1], RMSE = min(x[, 2])))) %>%
rownames_to_column("df")
df lb RMSE
1 nbb 9 0.26177950
2 mbb 7 0.11294590
3 cbb 9 0.02452239
4 tmbb 4 0.08290467
5 tcbb 9 0.41488540
輸入資料
此外,請注意您在帖子中定義資料框的方式不正確,我在此處包含了“正確”的方式以供參考。
nbb <- data.frame(
nbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
nbb_RMSE = c(1.0152338, 0.7199394, 0.7990978, 0.9045563, 1.6514406, 0.5160516, 0.4964024, 0.2617795))
mbb <- data.frame( mbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
mbb_RMSE = c(0.8324074, 0.9278236, 1.9817984, 0.9567368, 0.2814623, 0.1129459, 0.1233126, 0.4222578)
)
cbb <- data.frame(
cbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
cbb_RMSE = c(1.27782499, 1.96332220, 0.74704997, 0.46579943, 1.10850563, 0.40456698, 0.26027359, 0.02452239)
)
tmbb <- data.frame(
tmbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
tmbb_RMSE = c(0.83240742, 1.05126826, 0.08290467, 0.76397988, 1.23772208, 0.57628337, 0.56437185, 0.46460279))
tcbb <- data.frame(
tcbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
tcbb_RMSE = c(0.9328510, 0.8312332, 0.9402116, 1.6029357, 2.0001519, 0.4387557, 0.5965582, 0.4148854)
)
uj5u.com熱心網友回復:
如果您愿意接受一種purrr方法,您可以使用
library(purrr)
library(dplyr)
my_list %>%
map_dfr(~.x %>%
filter(if_any(ends_with("_RMSE"), ~.x == min(.x))) %>%
rename_with(~gsub(".*_", "", .x)),
.id = "df") %>%
bind_rows()
這回傳
df lb RMSE
1 cbb 9 0.02452239
2 mbb 7 0.11294590
3 nbb 9 0.26177950
4 tcbb 9 0.41488540
5 tmbb 4 0.08290467
with (借自 Rui Barradas)
my_list <- mget(ls(pattern = "bb$"))
uj5u.com熱心網友回復:
這是一個基本的 R 方式。
首先將 data.frames 放在一個帶有 的串列中mget,然后lapply串列是一個匿名函式,輸出最小的 RMSE 行。系結輸出行并根據想要的行名重新排序。
nbb <- data.frame(
nbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
nbb_RMSE = c(1.0152338, 0.7199394, 0.7990978, 0.9045563, 1.6514406, 0.5160516, 0.4964024, 0.2617795)
)
mbb <- data.frame(
mbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
mbb_RMSE = c(0.8324074, 0.9278236, 1.9817984, 0.9567368, 0.2814623, 0.1129459, 0.1233126, 0.4222578)
)
cbb <- data.frame(
cbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
cbb_RMSE = c(1.27782499, 1.96332220, 0.74704997, 0.46579943, 1.10850563, 0.40456698, 0.26027359, 0.02452239)
)
tmbb <- data.frame(
tmbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
tmbb_RMSE = c(0.83240742, 1.05126826, 0.08290467, 0.76397988, 1.23772208, 0.57628337, 0.56437185, 0.46460279)
)
tcbb <- data.frame(
tcbb_lb = c(2, 3, 4, 5, 6, 7, 8, 9),
tcbb_RMSE = c(0.9328510, 0.8312332, 0.9402116, 1.6029357, 2.0001519, 0.4387557, 0.5965582, 0.4148854)
)
df_list <- mget(ls(pattern = "bb$"))
tmp <- lapply(df_list, \(x){
i <- which.min(x[[2]])
if(length(i) > 0L) {
data.frame(lb = x[i, 1], RMSE = x[i, 2])
} else NULL
})
res <- do.call(rbind, tmp)
rm(tmp)
res <- cbind.data.frame(df = names(df_list), res)
i <- order(c("nbb", "mbb", "cbb", "tmbb", "tcbb"))
res <- res[i,]
res
#> df lb RMSE
#> nbb nbb 9 0.26177950
#> mbb mbb 7 0.11294590
#> cbb cbb 9 0.02452239
#> tmbb tmbb 4 0.08290467
#> tcbb tcbb 9 0.41488540
由reprex 包于 2022-04-10 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/457944.html
