【问题标题】:Best way to find weighted averages from two dataframes in R?从 R 中的两个数据帧中找到加权平均值的最佳方法?
【发布时间】:2021-09-04 17:36:22
【问题描述】:

R 新手很抱歉,如果这有点宽泛,但我什至不确定从哪里开始解决这个问题。

我有两个数据框,df1 包含来自某些人口普查区的人口统计数据。

           AfricanAmerican AsianAmerican    Hispanic    White
Tract1                0.25          0.25        0.25     0.25
Tract2                0.50          0.10        0.20     0.10  
Tract3                0.05          0.10        0.35     0.50

而 df2 包含观察多边形以及构成其面积的每个人口普查区域的百分比。

           Poly1      Poly2    Poly3    
Tract1      0.33       0.25     0.00     
Tract2      0.33       0.25     0.10      
Tract3      0.34       0.50     0.90    

我想要做的是获取每个观察多边形中人口统计数据的加权平均值

          AfricanAmerican AsianAmerican    Hispanic    White
Poly1                0.26          0.15        0.27     0.29
Poly2                0.21          0.14        0.29     0.34  
Poly3                0.10          0.10        0.34     0.46

到目前为止,我认为我可以做类似的事情

sum(df1$AfricanAmerican * df2$Poly1) 

然后使用 for 循环遍历一个多边形的所有人口统计变量,然后将其嵌套在另一个 for 循环中以遍历所有多边形,但鉴于我的工作数据集中有数百个人口普查区域和多边形,我想知道如果有更好的方法?

【问题讨论】:

  • 使用矩阵乘法:t(df2) %*% as.matrix(df1).

标签: r


【解决方案1】:

使用mapply中的产品colSums

t(mapply(function(...) colSums(`*`(...)), list(df1), df2))
#      AfricanAmerican AsianAmerican Hispanic  White
# [1,]          0.2645        0.1495   0.2675 0.2855
# [2,]          0.2125        0.1375   0.2875 0.3375
# [3,]          0.0950        0.1000   0.3350 0.4600

如果您想四舍五入到两位数,只需将round(..., 2) 包裹起来即可。


数据:

df1 <- read.table(header=T, text='
                           AfricanAmerican AsianAmerican    Hispanic    White
     Tract1                0.25          0.25        0.25     0.25
     Tract2                0.50          0.10        0.20     0.10  
     Tract3                0.05          0.10        0.35     0.50
')
df2 <- read.table(header=T, text='
                Poly1      Poly2    Poly3    
     Tract1      0.33       0.25     0.00     
     Tract2      0.33       0.25     0.10      
     Tract3      0.34       0.50     0.90  
')

【讨论】:

    【解决方案2】:

    library(tidyverse)
    

    样本数据

    df1 <-
      tibble(
        Trat = paste0("Trat",1:3),
        AfricanAmerican = c(.25,.5,.05),
        AsianAmerican = c(.25,.1,.1),
        Hispanic = c(.25,.2,.35)
      )
    
    df2 <-
      tibble(
        Trat = paste0("Trat",1:3),
        Poly1 = c(.33,.33,.34),
        Poly2 = c(.25,.25,.5),
        Poly3 = c(0,.1,.9)
      ) %>% 
      #Pivot df2 making a single column for all Poly values
      pivot_longer(cols = -Trat,names_to = "Poly")
    

    代码

    df1 %>% 
      #Join df1 and df2 by Trat
      left_join(df2) %>% 
      #Grouping by Poly
      group_by(Poly) %>%
      #Sum values across variables AfricanAmerican to Hispanic
      summarise(across(AfricanAmerican:Hispanic,function(x)sum(x*value)))
    

    输出

    Joining, by = "Trat"
    # A tibble: 3 x 4
      Poly  AfricanAmerican AsianAmerican Hispanic
      <chr>           <dbl>         <dbl>    <dbl>
    1 Poly1           0.264         0.150    0.268
    2 Poly2           0.212         0.138    0.288
    3 Poly3           0.095         0.1      0.335
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      相关资源
      最近更新 更多