【问题标题】:Simple Index-Calculation based on column-mean in RR中基于列均值的简单索引计算
【发布时间】:2020-05-24 21:52:06
【问题描述】:

我有一个大约 10 列的数据框。所有都是数字类型并指示不同的地理区域。有些是相对值,如一定程度的居民百分比,有些是总值,如总人口。它或多或少是这样的:

median_age bachelor_rate  emp_rate                       
1       35.2    0.05223252 0.6185185 
2       22.5    0.40045249 0.7744094 
3       36.3    0.26750261 0.8210526 
4       36.8    0.07753825 0.5801861 
5       29.9    0.04805492 0.3593074 
6       26.8    0.00000000 0.4762367 
> 

我想做的是为每一列计算一个“索引”。我想我会取每列的平均值,然后计算每个单元格值的平均值之差。 例如median_age-column的第一个单元格:

mean_age = mean(df$mean_age)
median_age_1 = df$median_age[1]
index = median_age_1/mean_age

除了所有数学和索引相关的问题。我如何编写一个对所有列和所有单元格执行此操作的函数?

【问题讨论】:

    标签: python r dataframe indexing statistics


    【解决方案1】:

    如果您选择使用 R,我认为,以下是一种方法。 mutate_all() 所做的是遍历所有列并执行完全相同的工作。所以你想认为. 成为每个列名,而 R 正在循环数据。对于每一列,您可以使用mean() 找到平均值。由于您想将每列中的每个值除以其平均值,您可以将这个想法表达为~./mean(.)。因为我给这个函数加了一个名字。 R 创建了三个新列。如果要覆盖原始列,可以执行以下操作:mutate_all(mydf, .funs = list(~./mean(.)))

    library(dplyr)
    
    mutate_all(mydf, .funs = list(index = ~./mean(.)))
    
      median_age bachelor_rate  emp_rate median_age_index bachelor_rate_index emp_rate_index
    1       35.2    0.05223252 0.6185185           1.1264           0.3705394      1.0224261
    2       22.5    0.40045249 0.7744094           0.7200           2.8408247      1.2801176
    3       36.3    0.26750261 0.8210526           1.1616           1.8976733      1.3572199
    4       36.8    0.07753825 0.5801861           1.1776           0.5500592      0.9590617
    5       29.9    0.04805492 0.3593074           0.9568           0.3409034      0.5939439
    6       26.8    0.00000000 0.4762367           0.8576           0.0000000      0.7872308
    

    数据

    mydf <- structure(list(median_age = c(35.2, 22.5, 36.3, 36.8, 29.9, 26.8
    ), bachelor_rate = c(0.05223252, 0.40045249, 0.26750261, 0.07753825, 
    0.04805492, 0), emp_rate = c(0.6185185, 0.7744094, 0.8210526, 
    0.5801861, 0.3593074, 0.4762367)), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    

    【讨论】:

    • 或者在base Rmydf[paste0(names(mydf), "_index")] &lt;- mydf/colMeans(mydf)[col(mydf)]
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多