如何使用R将两个数据集分别乘以两个月的组

z3yyvxxp  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(183)

我有一个数据集,它包含一个组(idgroup)和它的系数(coef列)。小例子

groups=structure(list(idgroup = c(1L, 3L, 4L), coef = c(2.1, 1.7, 1.3
)), class = "data.frame", row.names = c(NA, -3L))

和一个带有百分比的数据集。小例子

perc = structure(list(idgroup = c(1L, 2L, 4L, 5L), percent = c(0.4753, 
0.5392, 0.48, 0.51), month_id = c(202304L, 202304L, 202305L, 
202305L)), class = "data.frame", row.names = c(NA, -4L))

如何将groups表中的系数值乘以perc表中的idgroups的百分比值?在这种情况下,只有idgroups =1和4。
我可以自己做,但困难的是,它必须分别为每个month_id在这种情况下,我们只有2个。(例如,202304,202305)但只有在这样的方式,每个月都在自己的列
换句话说,所需的输出应该如下所示

idgroup month_id1 month_id2
1       1   0.99813        NA
2       4        NA     0.624

month_id1是第一个月(即202304),month_id2是第二个月(即202305)在perс中不会发生超过2个月
我怎么能得到这样一个理想的输出。先谢谢你。

nbysray5

nbysray51#

如果您对基于tidyverse的解决方案持开放态度,这可能会给您带来您正在寻找的东西:

library(dplyr)
library(tidyr)

groups %>% 
  inner_join(perc, by = "idgroup") %>% 
  mutate(value = coef * percent, .keep = "unused") %>%
  pivot_wider(names_from = month_id, values_from = value)

这个返回

# A tibble: 2 × 3
  idgroup `202304` `202305`
    <int>    <dbl>    <dbl>
1       1    0.998   NA    
2       4   NA        0.624

首先,我们使用inner_join将结果限制为两个数据集中都存在的idgroups。接下来,我们通过将coefpercent相乘,同时去除coefpercent来计算值。最后,我们使用pivot_wider将其转换为更宽的形式。这里的新列名基于month_id s。
或者是base R版本:

result <- merge(groups, perc, by = "idgroup")
result["value"] <- result$coef * result$percent
result["coef"] <- NULL
result["percent"] <- NULL

reshape(result, idvar = "idgroup", timevar = "month_id", direction = "wide")

返回

idgroup value.202304 value.202305
1       1      0.99813           NA
2       4           NA        0.624

相关问题