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

Sample function with probabilities dependent on another column

我正在使用 R 并想随机分配一个状态给行,概率取决于特定的列值。

我的 table(称为 df)看起来像这样:

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

等... 共有三个可能的级别 (1,2,3),所有年份介于 2011 年和 2022 年之间,以及许多国家/地区。行可以重复,有几千行。

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

2018  2019  2020  2021  2022
 123   100    99   189   211

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

我希望原来的 table 为所有行添加这个附加列,其中每年的 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 `

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

但我不确定如何将其合并到我的上述函数中。 `

非常感谢任何帮助。

要指示哪些行有资格被分配 TRUE,您可以使用以下表达式

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

表示如果 Year 严格大于 2018 年(即 2019 年或更大)的行是合格的 并且 Country 是 "Eng" , OR Year 是 2018 and Country 是 "Eng" and Level 是 2.

现在,在符合条件的行中分配 TRUEs。有几种方法可以做到这一点。一种方法是将符合条件的行按 Year 拆分,并根据 table.

中的值分配 TRUEs
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)

我们创建了一个函数,它接受两个参数:符合条件的行的数据帧,以及该数据帧的 TRUE 数量,以及 returns 具有随机分配的新列的数据帧 TRUE秒。 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.