首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R函数一次从每个类别中随机删除一个数据点?

R函数一次从每个类别中随机删除一个数据点?
EN

Stack Overflow用户
提问于 2021-10-14 14:46:33
回答 2查看 144关注 0票数 1

我试图分析一个珊瑚礁的覆盖率是如何变化的,就像用来分析珊瑚礁变化的点数一样。我的实际数据集由150张照片组成,每张有50分。这个想法是让R估计百分比覆盖所有这些点,然后从每一张照片中删除1个点并重新分析,然后删除另一个点并重新分析等等。

任何帮助,我可以如何写或找到,或我可以在哪里可以寻找这样的功能,是欢迎的,因为我是非常新的这一切!下面是一个样本数据集,只有3幅图,每幅图5点。因此,正如前面提到的,我们的思想是用所有的点进行分析,然后随机的每个图中删除一个点,然后重新分析和重复。基本上这个样本的第一个分析将是15分,下一个分析总共会有12个地块等。

样本数据集:

代码语言:javascript
运行
复制
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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-14 15:10:03

基R

代码语言:javascript
运行
复制
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,则删除该条件。

德普利

代码语言:javascript
运行
复制
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    
票数 1
EN

Stack Overflow用户

发布于 2021-10-14 15:15:36

这里是一个带有tapply/sample的基R函数。

它的参数是data.frame和分组列。

代码语言:javascript
运行
复制
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

数据

代码语言:javascript
运行
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69572770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档