gpt4 book ai didi

r - 大规模使用唯一值(for loops、apply 或 plyr)

转载 作者:行者123 更新时间:2023-12-01 03:51:33 27 4
gpt4 key购买 nike

我不确定这是否可能,但如果是,它会让生活变得更有效率。

更广泛的 SO 社区会感兴趣的一般问题:for 循环(以及诸如 apply 之类的基本函数)适用于一般/一致操作,例如向数据框的每一列或每一行添加 X。我有一个我想要执行的通用/一致操作,但数据框的每个元素都有唯一的值。

有没有办法比为每个分组设置我的数据框子集更有效,应用具有相对于该分组的特定数字的函数,然后重新组合?我不在乎它是 for 循环还是 apply,但如果它使用了 plyr 功能,我会加分。

这是我正在处理的更具体的问题:我有下面的数据。最终我想要的是一个具有日期的时间序列数据框,每一列代表一个区域与某个基准的关系。

问题是:每个区域的兴趣度量不同,基准也不同。这是数据:

library(dplyr)
library(reshape2)

data <- data.frame(
region = sample(c("northeast","midwest","west"), 100, replace = TRUE),
date = rep(seq(as.Date("2010-02-01"), length=10, by = "1 day"),10),
population = sample(50000:100000, 10, replace = T),
skiers = sample(1:100),
bearsfans = sample(1:100),
dudes = sample(1:100)
)

以及我正在处理的摘要框架:
data2 <- data %.%
group_by(date, region) %.%
summarise(skiers = sum(skiers),
bearsfans= sum(bearsfans),
dudes = sum(dudes),
population = sum(population)) %.%
mutate(ppl_per_skier = population/skiers,
ppl_per_bearsfan = population/bearsfans,
ppl_per_dude = population/dudes) %.%
select(date, region, ppl_per_skier, ppl_per_bearsfan , ppl_per_dude)

这是棘手的部分:
  • 对于东北,我只关心“ppl_per_skier”,基准是3500
  • 对于中西部,我只关心“ppl_per_bearsfan”,基准是1200
  • 对于西方,我只关心“ppl_per_dude”,基准是5000

  • 我想出的任何解决这个问题的方法都涉及为每个度量创建子集,但是用数百个度量和不同的基准大规模地这样做是......并不理想。例如:
    midwest <- data2 %.% 
    filter(region == "midwest") %.%
    select(date, region, ppl_per_bearsfan) %.%
    mutate(bmark = 1200, against_bmk = bmark/ppl_per_bearsfan-1) %.%
    select(date, against_bmk)

    同样,对于每个区域,其各自的度量和各自的基准,然后按日期将它们重新组合在一起。最终,我想要这样的东西,其中每个地区相对于其特定基准和衡量标准的表现按日期排列(当然,这是假数据):
            date midwest_againstbmk northeast_againstbmk west_againstbmk
    1 2010-02-10 0.9617402 0.6008032 0.3403260
    2 2010-02-11 0.5808621 0.5119942 0.7787559
    3 2010-02-12 0.4828346 0.6560053 0.3747920
    4 2010-02-13 0.6499841 0.7567194 0.8387461
    5 2010-02-14 0.6367520 0.4564254 0.7269161

    当我对每个组都有独特的度量和基准值时,有没有办法获得这种数据和结构,而不必为每个分组做 X 个子集?

    最佳答案

    似乎是 mapply 的明显用例:

    > mapply(function(d,y,b) {(b/d[,y])-1},
    split(data2,data2$region),
    c('ppl_per_bearsfan','ppl_per_skier','ppl_per_dude'),
    c(1200,3500,5000))
    midwest northeast west
    [1,] -0.26625428 -0.02752186 3.5881957
    [2,] 0.48715638 1.89169295 2.6928546
    [3,] -0.94222992 1.26065537 4.0388343
    [4,] -0.38116663 0.79572184 1.4118364
    [5,] -0.05937874 2.05459482 1.8822015
    [6,] -0.41463925 1.60668461 1.5914408
    [7,] -0.31211391 1.21093777 2.7517886
    [8,] -0.88923466 0.44917981 1.2251965
    [9,] -0.02781965 -0.24637182 2.7143103
    [10,] -0.46643682 1.28944776 0.6246315

    关于r - 大规模使用唯一值(for loops、apply 或 plyr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22116489/

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