我使用dplyr计算索引。索引是组中每个条目与总条目之间的平方比的总和。
library(dplyr)
set.seed(1e2)
firm_id <- sample(1:3, 1e2, rep=T)
pro_id <- sample(1:8, 1e2, rep=T)
emplo_id <- sample(1:5, 1e2, rep=T)
cost <- round(abs(rnorm(1e2, 20)), 2)
df <- data.frame(firm_id, pro_id, emplo_id, cost)
df_index <- df %>% group_by(firm_id,pro_id) %>%
mutate(INDEX = sum((cost/sum(cost))^2))
我现在要计算每个条目对其组产生的idex的贡献,这意味着我想计算一个新索引,就好像一个值的条目成本为0,而对于每个条目来说,这就像在循环中一样(然后将新索引除以旧索引)。
预期结果:
firm_id <- c(1,1,1)
pro_id <- c(1,1,1)
emplo_id <- c(1:3)
cost <- c(1,50,100)
INDEX <- rep(0.5482654,3)
newINDEX <- c(0.5555556,0.9803941,0.9615532)
df_index <- data.frame(firm_id, pro_id, emplo_id, cost, INDEX, newINDEX)
使用mutate我不知道该怎么做。 欢迎任何建议!
答案 0 :(得分:2)
您可以使用purrr::map_dbl()
遍历每个索引中的行索引
组,然后应用在给定索引处替换cost
的函数
为0,然后重新计算索引。这是一个数据示例
您给出了预期的输出:
library(dplyr)
library(purrr)
# The function used to calculate the index value
index <- function(x) sum((x / sum(x)) ^ 2)
df_index %>%
group_by(firm_id, pro_id) %>%
mutate(new = map_dbl(row_number(), function(i) {
index(replace(cost, i, 0))
}))
#> # A tibble: 3 x 7
#> # Groups: firm_id, pro_id [1]
#> firm_id pro_id emplo_id cost INDEX newINDEX new
#> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1 1 0.548 0.556 0.556
#> 2 1 1 2 50 0.548 0.980 0.980
#> 3 1 1 3 100 0.548 0.962 0.962
index_without <- function(i, x) {
map_dbl(i, function(i) index(replace(x, i, 0)))
}
df_index %>%
group_by(firm_id, pro_id) %>%
mutate(new = index_without(row_number(), cost))
#> # A tibble: 3 x 7
#> # Groups: firm_id, pro_id [1]
#> firm_id pro_id emplo_id cost INDEX newINDEX new
#> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1 1 0.548 0.556 0.556
#> 2 1 1 2 50 0.548 0.980 0.980
#> 3 1 1 3 100 0.548 0.962 0.962
由reprex package(v0.2.0.9000)于2018-08-08创建。