代码之家  ›  专栏  ›  技术社区  ›  rw2

概率依赖于另一列的样本函数

  •  0
  • rw2  · 技术社区  · 7 年前

    我使用的是R,希望随机为行分配一个状态,概率取决于特定的列值。

    我的表(称为df)如下所示:

    Year    Level  Country    
    2018    1      Eng
    2018    2      Wal
    2018    1      Eng
    2019    3      Sco
    

    等2011年至2022年间,有三个可能的水平(1、2、3)以及许多国家。行可以复制,并且有数千行。

    我想添加一个值为TRUE或FALSE的新列。我有一个单独的表(称为表1),告诉我每年应该有多少真实值:

    2018  2019  2020  2021  2022
     123   100    99   189   211
    

    然而,只有具备特定条件的行才能获得真正的值——它们必须从2018年开始,必须以Eng作为其国家,如果年份是2018年,则它们的级别为2(其他年份的级别无关紧要)。

    我希望原始表中的所有行都有这个附加列,其中每年的True数与表1中的匹配。

    我试过各种方法。我开始尝试将条件与“&”结合起来与sample()函数一起使用。

    newtable <- df$Country == "Eng" &
                df$Level = 2 & 
                df$Year >= 2018 &
                sample(c(T,F),nrows(df),replace=T,prob=c(???))
    

    但随后,我陷入了不同年份的概率差异,以及如何将表1中的原始数字转换为概率的问题。

    我还被困在如何将略有不同的过滤器应用于2018年(仅限2级)-我可以使用这个dplyr:过滤器`

    filter(!(Year==2018 and Level!=2))
    

    但我不知道如何将其纳入我的上述函数中。 `

    非常感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Weihuang Wong    7 年前

    指示有资格分配的行 TRUE ,可以使用以下表达式

    df$eligible <- (df$Year > 2018 & df$Country == "Eng") | 
        (df$Year == 2018 & df$Country == "Eng" & df$Level == 2)
    

    也就是说如果 Year 严格大于2018年(即2019年或更大) Country 为“Eng”, is 2018年 为“Eng” Level 为2。

    现在,分配 符合事实的 符合条件的行中的。有几种方法可以做到这一点。一种方法是将符合条件的行按 并分配 符合事实的 s根据表中的值。

    eligible <- df[df$eligible, ]
    trues <- c(123, 100, 99, 189, 211)
    

    现在,使用 mapply :

    new_df <- mapply(FUN = function(x, n) {
      x$new_column <- FALSE
      x$new_column[sample(1:nrow(x), n)] <- TRUE
      x
    }, x = split(eligible, eligible$Year), n = trues, SIMPLIFY = FALSE)
    

    我们创建了一个接受两个参数的函数:符合条件的行的数据帧和 符合事实的 s表示该数据帧,并返回带有随机分配的新列的数据帧 符合事实的 s mapply公司 然后应用 split(eligible, eligible$Year) (包含五个数据帧的列表,每个数据帧对应于2018年至2022年之间的一年)以及 trues (有五个元素的向量)与函数平行。

    完成,

    new_df <- do.call(rbind, new_df)
    new_df <- rbind(new_df, cbind(df[!df$eligible, ], new_column = FALSE))
    

    我们行绑定的输出 mapply(...) (一个包含五个数据帧的列表),然后 rbind 对于附加了新列的不符合条件的行,根据定义,其值为, FALSE .