如何在 R 中选定的数据框列中实现归一化公式
How to implement a normalization formula in selected columns of data frame in R
我正在做一个包含城市数据的个人项目,我被困在必须规范化数据以应用 k-means 聚类的地方。我做了一些挖掘并在这里找到了这个公式:
这是可重现的例子
options(scipen = 999)
tract_per_complaints <- data.frame(
tract= c(7354, 5036, 17406, 5675, 2354),
fire= c(32, 0, 3, 78, 9),
flood= c(1, 25, 6, 8,7),
noise= c(56, 67, 0, 0, 1),
total_complaints_at_this_tract= c(89, 92, 9, 86, 17),
population_at_this_tract= c(34134, 103849, 345300, 43535, 2143767)
)
# tract fire flood noise total_complaints_at_this_tract population_at_this_tract
#1 7354 32 1 56 89 34134
#2 5036 0 25 67 92 103849
#3 17406 3 6 0 9 345300
#4 5675 78 8 0 86 43535
#5 2354 9 7 1 17 2143767
所以我只想将上面的公式应用于有投诉的单元格,tract_per_complaints[ ,2:4]
。所以我做了一个嵌套的 for
循环,但没有用。然后像这样应用 sweep()
函数:
sweep(tract_per_complaints[ ,c(2:4)], 1, FUN="/", tract_per_complaints$population_at_this_tract)
#wrong output
# fire flood noise
#1 0.000937481690 0.00002929630 0.0016405929572
#2 0.000000000000 0.00024073414 0.0006451675028
#3 0.000008688097 0.00001737619 0.0000000000000
#4 0.001791661881 0.00018376019 0.0000000000000
#5 0.000004198217 0.00000326528 0.0000004664686
不幸的是,这是我对这个问题的最佳尝试。接下来我可以尝试什么?我看过这些:
Normalizing columns in R according to a formula
Need help implementing a function in R
How to use the 'sweep' function
我不确定 sweep
是否适合这里的工具,因为您还没有要清除的汇总统计数据。您可以使用 apply
:
apply(tract_per_complaints[ ,c(2:4)], 2,
FUN=function(v, p) { v * p / sum(v * p)},
p = tract_per_complaints$population_at_this_tract)
输出:
fire flood noise
[1,] 0.04401224 0.001701866 0.1735655
[2,] 0.00000000 0.129443578 0.6317793
[3,] 0.04174017 0.103296596 0.0000000
[4,] 0.13682627 0.017364677 0.0000000
[5,] 0.77742131 0.748193282 0.1946551
作为替代方案,您还可以查看 dplyr::mutate_at
。
我正在做一个包含城市数据的个人项目,我被困在必须规范化数据以应用 k-means 聚类的地方。我做了一些挖掘并在这里找到了这个公式:
options(scipen = 999)
tract_per_complaints <- data.frame(
tract= c(7354, 5036, 17406, 5675, 2354),
fire= c(32, 0, 3, 78, 9),
flood= c(1, 25, 6, 8,7),
noise= c(56, 67, 0, 0, 1),
total_complaints_at_this_tract= c(89, 92, 9, 86, 17),
population_at_this_tract= c(34134, 103849, 345300, 43535, 2143767)
)
# tract fire flood noise total_complaints_at_this_tract population_at_this_tract
#1 7354 32 1 56 89 34134
#2 5036 0 25 67 92 103849
#3 17406 3 6 0 9 345300
#4 5675 78 8 0 86 43535
#5 2354 9 7 1 17 2143767
所以我只想将上面的公式应用于有投诉的单元格,tract_per_complaints[ ,2:4]
。所以我做了一个嵌套的 for
循环,但没有用。然后像这样应用 sweep()
函数:
sweep(tract_per_complaints[ ,c(2:4)], 1, FUN="/", tract_per_complaints$population_at_this_tract)
#wrong output
# fire flood noise
#1 0.000937481690 0.00002929630 0.0016405929572
#2 0.000000000000 0.00024073414 0.0006451675028
#3 0.000008688097 0.00001737619 0.0000000000000
#4 0.001791661881 0.00018376019 0.0000000000000
#5 0.000004198217 0.00000326528 0.0000004664686
不幸的是,这是我对这个问题的最佳尝试。接下来我可以尝试什么?我看过这些:
Normalizing columns in R according to a formula
Need help implementing a function in R
How to use the 'sweep' function
我不确定 sweep
是否适合这里的工具,因为您还没有要清除的汇总统计数据。您可以使用 apply
:
apply(tract_per_complaints[ ,c(2:4)], 2,
FUN=function(v, p) { v * p / sum(v * p)},
p = tract_per_complaints$population_at_this_tract)
输出:
fire flood noise
[1,] 0.04401224 0.001701866 0.1735655
[2,] 0.00000000 0.129443578 0.6317793
[3,] 0.04174017 0.103296596 0.0000000
[4,] 0.13682627 0.017364677 0.0000000
[5,] 0.77742131 0.748193282 0.1946551
作为替代方案,您还可以查看 dplyr::mutate_at
。