gpt4 book ai didi

r - 对数据帧中特定值的总和进行高效重采样

转载 作者:行者123 更新时间:2023-12-01 12:25:46 24 4
gpt4 key购买 nike

我的数据是这样的:

df <- data.frame(
x = c("dog", "dog", "dog", "cat", "cat", "fish", "fish", "fish", "squid", "squid", "squid"),
y = c(10, 11, 6, 3, 4, 5, 5, 9, 14, 33, 16)
)

我想遍历数据并为某个“包含/过滤器”列表中的每只动物获取一个值,然后将它们相加。

例如,也许我只关心狗、猫和鱼。

animals <- c("dog", "cat", "fish")

在重采样 1 中,我可以得到 10、4、9(总和 = 23),在重采样 2 中我可以得到 6、3、5(总和 = 14)。

我刚刚创建了一个依赖于 dplyr 的非常简陋的 replicate/for 函数,但它看起来非常低效:

ani_samp <- function(animals){

total <- 0
for (i in animals) {

v <- df %>%
filter(x == i) %>%
sample_n(1) %>%
select(y) %>%
as.numeric()

total <- total + v
}
return(total)
}

replicate(1000,ani_samp(animals))

我该如何改进这个重采样/伪 Bootstrap 代码?

最佳答案

我不确定这是否更好(没有时间进行基准测试),但您可以避免此处的双循环。您可以先按 animals 过滤(并因此处理子集),然后从每个组中仅对 n 样本进行一次采样。如果你喜欢 dplyr,这里有一个可能的 dplyr/tidyr 版本

library(tidyr)
library(dplyr)

ani_samp <- function(animals, n){
df %>%
filter(x %in% animals) %>% # Work on a subset
group_by(x) %>%
sample_n(n, replace = TRUE) %>% # sample only once per each group
group_by(x) %>%
mutate(id = row_number()) %>% # Create an index for rowSums
spread(x, y) %>% # Convert to wide format for rowSums
mutate(res = rowSums(.[-1])) %>% # Sum everything at once
.$res # You don't need this if you want a data.frame result instead
}

set.seed(123) # For reproducible output
ani_samp(animals, 10)
# [1] 18 24 14 24 19 18 19 19 19 14

关于r - 对数据帧中特定值的总和进行高效重采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39944255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com