我試圖分析估計珊瑚礁的覆寫百分比如何隨著用于分析珊瑚礁變化的點數而變化。我的實際資料集由 150 張照片組成,每張照片有 50 個點。這個想法是讓 R 估計所有這些點的覆寫百分比,然后從每張照片中洗掉 1 個點并重新分析,然后洗掉另一個點并重新分析等。
歡迎任何有關我如何撰寫或查找或在何處查找此類函式的幫助,因為我對這一切都很陌生!下面是一個樣本資料集,只有 3 個圖,每個圖有 5 個點。因此,如前所述,這個想法是對所有點進行分析,然后從每個圖中隨機洗掉一個點,重新分析并重復。基本上這個樣本第一次分析將是 15 個點,下一個分析將是總共 12 個圖等。
示例資料集:
Plot ID
1 S
1 S
1 S
1 T
1 T
2 S
2 C
2 C
2 SP
2 S
3 S
3 T
3 T
3 C
3 T
謝謝!
uj5u.com熱心網友回復:
基數R
set.seed(42)
dat[ave(rep(TRUE, nrow(dat)), dat$Plot,
FUN = function(z) length(z) > 1 & !seq_along(z) %in% sample(length(z), 1)),]
# Plot ID
# 2 1 S
# 3 1 S
# 4 1 T
# 5 1 T
# 6 2 S
# 7 2 C
# 8 2 C
# 9 2 SP
# 12 3 T
# 13 3 T
# 14 3 C
# 15 3 T
我添加了確保最小大小為 1 ( length(z) > 1)的邏輯,如果您有不同的需求,您可能想要提高它,或者如果您不關心洗掉Plot只有一行時的a ,則洗掉該條件。
dplyr
library(dplyr)
set.seed(42)
dat %>%
group_by(Plot) %>%
sample_n(n() - 1) %>%
ungroup()
# # A tibble: 12 x 2
# Plot ID
# <int> <chr>
# 1 1 S
# 2 1 T
# 3 1 T
# 4 1 S
# 5 2 C
# 6 2 SP
# 7 2 S
# 8 2 C
# 9 3 S
# 10 3 C
# 11 3 T
# 12 3 T
uj5u.com熱心網友回復:
這是一個帶有 的基本 R 函式tapply/sample。
它的引數是 data.frame 和分組列。
sample_rows <- function(data, group){
group <- as.character(substitute(group))
tapply(seq_len(nrow(data)), data[[group]], \(x) sample(x, 1))
}
set.seed(2021)
i <- sample_rows(df1, Plot)
df2 <- df1[-i, ]
nrow(df2)
#[1] 12
i <- sample_rows(df2, Plot)
df2 <- df2[-i, ]
nrow(df2)
#[1] 9
資料
df1 <-
structure(list(Plot = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L), ID = c("S", "S", "S", "T", "T", "S", "C",
"C", "SP", "S", "S", "T", "T", "C", "T")), class = "data.frame",
row.names = c(NA, -15L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318475.html
