我正在嘗試在 R 中創建一個空引導程式。資料集有四個物種和相關的樣本值。我想計算mean
一個特殊的poisson
函式,一次從與每個物種相關的分布中采樣 5 個值。這是我對代碼的嘗試。我采樣了 5 個樣本,并嘗試使用 summarise 從這五個值中計算均值和泊松函式。我收到一條錯誤訊息,! New rows can't add columns.
顯示有關如何更正此問題以獲得所需輸出的任何建議(附加)。
set.seed(111)
library(truncnorm)
sample <- rtruncnorm(n = 1440,a = 0,b = 10,mean = 5,sd = 2)
sp <- rep(c("A","B","C","D"), each = 360)
df <- data.frame(sample, sp)
output <- tibble(mean.set = numeric(),
poisson.set = numeric(),
sp = character(),
set = numeric()
set.seed(42)
for(i in 1:1440){
samp1 <- df %>% filter(sp == 'A') %>% sample_n(5, replace = TRUE) %>% summarise(mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE)))) %>% mutate(set = i)
samp2 <- df %>% filter(sp == 'B') %>% sample_n(5, replace = TRUE) %>% summarise(mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE))))%>% mutate(set = i)
samp3 <- df %>% filter(sp == 'C') %>% sample_n(5, replace = TRUE) %>% summarise(mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE))))%>% mutate(set = i)
samp4 <- df %>% filter(sp == 'D') %>% sample_n(5, replace = TRUE) %>% summarise(mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE))))%>% mutate(set = i)
output %>% add_row(bind_rows(samp1, samp2, samp3, samp4)) -> output
}
Error:
! New rows can't add columns.
? Can't find columns `possion.set` and `set` in `.data`.
Run `rlang::last_error()` to see where the error occurred
#Expected output
set mean.set poisson.set sp
1 5 2 A
2 4 9 A
....
48 12 0 A
1 5 2 B
2 4 9 B
....
48 22 0 B
.....
uj5u.com熱心網友回復:
錯誤問題是基于“輸出”中列名的差異,即poisson.set
for 回圈中的列名possion.set
。通過糾正其中任何一個,它可以作業(此外,sp
未在summarise
結果中創建NA
)
output <- tibble(mean.set = numeric(),
possion.set = numeric(),
sp = character(),
set = numeric()
)
> set.seed(42)
> for(i in 1:1440){
samp1 <- df %>% filter(sp == 'A') %>% sample_n(5, replace = TRUE) %>% summarise(sp = "A", mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE)))) %>% mutate(set = i)
samp2 <- df %>% filter(sp == 'B') %>% sample_n(5, replace = TRUE) %>% summarise(sp = "B", mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE))))%>% mutate(set = i)
samp3 <- df %>% filter(sp == 'C') %>% sample_n(5, replace = TRUE) %>% summarise(sp = "C", mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE))))%>% mutate(set = i)
samp4 <- df %>% filter(sp == 'D') %>% sample_n(5, replace = TRUE) %>% summarise(sp = "D", mean.set = mean(sample, na.rm=TRUE), possion.set = ((var(sample, na.rm=TRUE)/ mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE))))%>% mutate(set = i)
output %>% add_row(bind_rows(samp1, B = samp2,samp3, samp4)) -> output
}
此外,我們也可以在沒有for
回圈的情況下執行此操作,即group_by
“sp”列并replicate/rerun
用于多次迭代
library(dplyr)
library(purrr)
output2 <- rerun(1440, df %>%
group_by(sp) %>%
slice_sample(n = 5, replace = TRUE) %>%
summarise(mean.set = mean(sample, na.rm=TRUE),
possion.set = ((var(sample, na.rm=TRUE)/
mean(sample, na.rm=TRUE)^2) - (1/mean(sample, na.rm=TRUE))))) %>%
bind_rows(.id = 'set')
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/492623.html