【问题标题】:Create a long list where each element of one list is repeated/ multiplied by a value from another dataframe创建一个长列表,其中一个列表的每个元素都重复/乘以另一个数据帧中的值
【发布时间】:2021-07-10 13:11:30
【问题描述】:

我遇到了一个难题,我找不到任何关于堆栈溢出的明显答案,所以想知道我是否可以选择专业知识蜂巢思维!

我基本上有一个提供商列表,我按地区分组以获得每个地区的提供商数量,然后我还将总数除以我想要分配给它们的多个术语并四舍五入(12 个术语)。

看起来像这样:

region total term
East Midlands 24 2
NEYH 46 4

等等。

我有一个包含 12 个术语(2021 年春季、2021 年夏季等直到 2026 年夏季)的列表,我想将此列表的每个元素乘以(或重复)每个区域的术语值。因此,例如东米德兰兹将是每学期 2 倍,所以看起来像:

region assigned term
East Midlands Spring 2021
East Midlands Spring 2021
East Midlands Summer 2021
East Midlands Summer 2021

等等。对于 NEYH 2021 年春季将重复 4 次,然后再进入 2021 年夏季 4 次,依此类推,一直到 2026 年夏季。理想情况下,我希望将其列在一个长列表中,这样我就可以按地区将其重新加入我的主数据集并它将按照每个区域的正确顺序排列,尽管可能有更好的方法!

我还没有为这个问题创建任何远程工作的代码,我正在尝试循环但没有快速实现。感谢您的任何建议!

【问题讨论】:

    标签: r list vector matrix-multiplication vector-multiplication


    【解决方案1】:

    数据

    df <- data.frame(region = c("East Midlands", "NEYH"), 
                     total = c(24, 46), 
                     term = c(2, 4))
    > df
    
                 region total term
        1 East Midlands    24    2
        2          NEYH    46    4
    

    代码

    terms <- do.call("c", 
                     sapply(1:length(df$term), 
                            function(x) rep(paste(c("Spring", "Summer"), c(2021:2026, 2021:2026)), 
                                            each = df$term[x]))) 
    region <- do.call("c", 
                       sapply(1:length(df$term), 
                              function(x) rep(rep(df$region[x], 
                                              times = df$term[x]), times = 12)))
    final_df <- cbind.data.frame(region, terms)
    

    输出

    > final_df
              region       terms
    1  East Midlands Spring 2021
    2  East Midlands Spring 2021
    3  East Midlands Summer 2022
    4  East Midlands Summer 2022
    5  East Midlands Spring 2023
    6  East Midlands Spring 2023
    7  East Midlands Summer 2024
    8  East Midlands Summer 2024
    9  East Midlands Spring 2025
    10 East Midlands Spring 2025
    11 East Midlands Summer 2026
    12 East Midlands Summer 2026
    13 East Midlands Spring 2021
    14 East Midlands Spring 2021
    15 East Midlands Summer 2022
    16 East Midlands Summer 2022
    17 East Midlands Spring 2023
    18 East Midlands Spring 2023
    19 East Midlands Summer 2024
    20 East Midlands Summer 2024
    21 East Midlands Spring 2025
    22 East Midlands Spring 2025
    23 East Midlands Summer 2026
    24 East Midlands Summer 2026
    25          NEYH Spring 2021
    26          NEYH Spring 2021
    27          NEYH Spring 2021
    28          NEYH Spring 2021
    29          NEYH Summer 2022
    30          NEYH Summer 2022
    31          NEYH Summer 2022
    32          NEYH Summer 2022
    33          NEYH Spring 2023
    34          NEYH Spring 2023
    35          NEYH Spring 2023
    36          NEYH Spring 2023
    37          NEYH Summer 2024
    38          NEYH Summer 2024
    39          NEYH Summer 2024
    40          NEYH Summer 2024
    41          NEYH Spring 2025
    42          NEYH Spring 2025
    43          NEYH Spring 2025
    44          NEYH Spring 2025
    45          NEYH Summer 2026
    46          NEYH Summer 2026
    47          NEYH Summer 2026
    48          NEYH Summer 2026
    49          NEYH Spring 2021
    50          NEYH Spring 2021
    51          NEYH Spring 2021
    52          NEYH Spring 2021
    53          NEYH Summer 2022
    54          NEYH Summer 2022
    55          NEYH Summer 2022
    56          NEYH Summer 2022
    57          NEYH Spring 2023
    58          NEYH Spring 2023
    59          NEYH Spring 2023
    60          NEYH Spring 2023
    61          NEYH Summer 2024
    62          NEYH Summer 2024
    63          NEYH Summer 2024
    64          NEYH Summer 2024
    65          NEYH Spring 2025
    66          NEYH Spring 2025
    67          NEYH Spring 2025
    68          NEYH Spring 2025
    69          NEYH Summer 2026
    70          NEYH Summer 2026
    71          NEYH Summer 2026
    72          NEYH Summer 2026
    

    说明

    我们根据给定信息使用sapply()rep() 复制术语和区域,然后将结果向量列表与do.call()c() 连接起来。

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 2016-09-13
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2016-05-23
      相关资源
      最近更新 更多