這是基本 R 中的簡單回圈:
# prep
x <- sort(round(10 * rnorm(10)))
res.sd <- NULL
res.var <- NULL
res.mad <- NULL
#loop
for(i in -20:20){
x[10] <- i
res.sd <- c(res.sd, sd(x))
res.var <- c(res.var, var(x))
res.mad <- c(res.mad, mad(x))
}
我想在 dplyr 中重寫它
uj5u.com熱心網友回復:
我們可以使用 purrr 和 tibble 的組合。
library(tidyverse)
set.seed(0)
x <- sort(round(10 * rnorm(10)))
map_dfr(-20:20, ~ tibble(
res.sd = sd(c(x[-10], .)),
res.var = var(c(x[-10], .)),
res.mad = mad(c(x[-10], .))
))
#> # A tibble: 41 × 3
#> res.sd res.var res.mad
#> <dbl> <dbl> <dbl>
#> 1 11.7 138. 15.6
#> 2 11.6 134. 15.6
#> 3 11.4 130. 15.6
#> 4 11.2 126. 15.6
#> 5 11.1 122. 15.6
#> 6 10.9 119. 15.6
#> 7 10.8 116. 14.8
#> 8 10.6 113. 14.1
#> 9 10.5 110. 13.3
#> 10 10.4 108. 12.6
#> # … with 31 more rows
由reprex 包(v2.0.1)創建于 2022-01-09
uj5u.com熱心網友回復:
如果我正確理解您的代碼,它會執行以下操作:
- 生成 10 個亂數存盤在
x. - 在迭代 的回圈中
-20:20,將 的第 10 個值替換x為迭代值。 - 計算修改向量的 SD、方差和中值絕對偏差,并存盤這些計算。
正如 ekoam 指出的那樣,這種型別的操作不適合 dplyr 的預期目的。也就是說,存盤串列列的能力使這成為可能(盡管效率低下,因為它需要存盤x向量的多個副本)。如果您set.seed(0)在第一行之前添加以控制隨機化,則以下將產生與您的代碼相同的結果。
set.seed(0)
df <- tibble(
x = list(sort(round(10 * rnorm(10)))),
y = -20:20
) %>%
rowwise() %>%
mutate(
res.sd = sd(c(x[-10], y)),
res.var = var(c(x[-10], y)),
res.mad = mad(c(x[-10], y))
)
# A tibble: 41 × 5
# Rowwise:
x y res.sd res.var res.mad
<list> <int> <dbl> <dbl> <dbl>
1 <dbl [10]> -20 11.7 138. 15.6
2 <dbl [10]> -19 11.6 134. 15.6
3 <dbl [10]> -18 11.4 130. 15.6
4 <dbl [10]> -17 11.2 126. 15.6
5 <dbl [10]> -16 11.1 122. 15.6
6 <dbl [10]> -15 10.9 119. 15.6
7 <dbl [10]> -14 10.8 116. 14.8
8 <dbl [10]> -13 10.6 113. 14.1
9 <dbl [10]> -12 10.5 110. 13.3
10 <dbl [10]> -11 10.4 108. 12.6
或者,我們可以稍微巧妙地使用lapplyand sapply,然后將結果存盤在 tibble 中。注意這里幾乎沒有重復的代碼:
set.seed(0)
x <- sort(round(10 * rnorm(10)))
y <- -20:20
lapply(list(sd = sd, var = var, mad = mad), function(func) {
sapply(y, function(j) {
func(c(x[-10], j))
})
}) %>%
as_tibble()
# A tibble: 41 × 3
sd var mad
<dbl> <dbl> <dbl>
1 11.7 138. 15.6
2 11.6 134. 15.6
3 11.4 130. 15.6
4 11.2 126. 15.6
5 11.1 122. 15.6
6 10.9 119. 15.6
7 10.8 116. 14.8
8 10.6 113. 14.1
9 10.5 110. 13.3
10 10.4 108. 12.6
# … with 31 more rows
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408656.html
標籤:
上一篇:在R包中使用“for”回圈和錯誤訊息“`[.data.frame`(,c("date",i))中的錯誤:選擇了未定義的列”
下一篇:Rfor回圈幫助根據條件進行修剪
